嗨,各位,今天来个小技巧,估计很多人都知道,我也就重复提下罢了。。

比如

升级更新框

通知提示框

我们看到,我用红框框出来的地方

1.直接使用系统自带的AlertDialog的提示框,我们看到了我们更新提示里面的具体内容是(-Bug修改 -新增更新提示);并且换行了。

2.是自定义的弹框,(自定义弹框用的是我自己封装的类:项目需求讨论-Android 自定义Dialog实现步骤及封装),我们看到里面的内容会有各种排版,有些是黑色加粗,有些是换行。有些字体可能颜色不同突出明显,等等需求。

归结

归结起来,我们不可能是好几个TextView,然后去自己一个段落一个TextView去呈现,一般都是跟后台约定好,让他传过来HTML格式的字符串

所以1.里面我们就是

AlertDialog.Builder builder = new AlertDialog.Builder(activity);

builder.setMessage(Html.fromHtml(info.getChangeLog()));

2.里面我们是

TextView message = (TextView) view.findViewById(R.id.message);

if(!TextUtils.isEmpty(content)){

message.setText(Html.fromHtml(content));

}

所以后台传过来的时候,就是可能是这种

{"content":"低**:本月销售业绩。诺**:本月销售业"}

然后我们就一个TextView就可以呈现不同的格式的内容。只要用Html.fromHtml(String);先转一下,再赋给TextView即可。

老司机这就完了?????

答案当然是No。

你会发现Html.fromHtml(String message)这个方法画了横线,已经过时了。WHF。那应该用什么。

@SuppressWarnings("deprecation")

public static Spanned fromHtml(String html){

Spanned result;

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {

result = Html.fromHtml(html,Html.FROM_HTML_MODE_LEGACY);

} else {

result = Html.fromHtml(html);

}

return result;

}

我们在Android 6 及以下,还是使用Html.fromHtml(String);而在Android 7 及以上要用新的:Html.fromHtml(String , flags);

这个Config分为哪些呢:

flags有这些:

public static final int FROM_HTML_MODE_COMPACT = 63;

public static final int FROM_HTML_MODE_LEGACY = 0;

public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256;

public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32;

public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16;

public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2;

public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8;

public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4;

public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1;

public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0;

public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1;

看了还是不懂,没关系。效果图放出来:

This is a paragraph with a style

Heading H4

  • li orange element

  • li #2 element

This is a blockquote

Text after blockquote

Text before div

This is a div

Text after div

不同Config的情况下显示的Html格式的文字呈现效果。

image

继续放招

我们用如下代码:

String message = "低**:本月销售业绩。诺**:本月销售业";

textView.setText(Html.fromHtml(message));

OK,没问题。我们知道会出来我们上面的自定义提示框的格式。

但是我们如果是

textView.setText(Html.fromHtml(message)+"");

没错,我们把Html.fromHtml(message)和字符串拼接之后,再传给TextView,那么那些,等标签就无效了。
还是有效。

所以我们如果有需求要拼接字符串,一定要先把要拼接的字符串拼接完后,再用Html.fromHtml包裹,然后赋值给TextView。

有些人说我的字符串不是在代码中,而是在strings.xml中定义,但是直接XML中的标签里面定义很多其他标签:......。在低版本的Android设备可能会直接忽略这些标签,这时候我们可以使用,这个标记所包含的内容将表示为纯文本。

比如: 有颜色的文字
换一行显示
再换一行显示]]>

老司机最后一招

大家都知道,Html格式中改变字体大小的是但是你会发现:

String htmlText = ""+productName+"
"

+ "积分:"

+ "+"+productPoint+"分";

TextView tv = (TextView)findViewById(R.id.productNameAndPoint);

tv.setText(Html.fromHtml(htmlText));

我们的颜色的设置是有效的,但是却无效。

解决方法:

1.如果项目的字体大小要求不是很精致,只是单纯的为了标题突出等,可以用我们上面的,,等

2.我们自定义标签。思路是替换font标签自己解析设置。用到的接口是Html类TagHandler接口:

public class DdbFontHandler implements TagHandler {

private int startIndex = 0;

private int stopIndex = 0;

@Override

public void handleTag(boolean opening, String tag, Editable output,

XMLReader xmlReader) {

processAttributes(xmlReader);

if(tag.equalsIgnoreCase("ddbfont")){

if(opening){

startFont(tag, output, xmlReader);

}else{

endFont(tag, output, xmlReader);

}

}

}

public void startFont(String tag, Editable output, XMLReader xmlReader) {

startIndex = output.length();

}

public void endFont(String tag, Editable output, XMLReader xmlReader){

stopIndex = output.length();

String color = attributes.get("color");

String size = attributes.get("size");

size = size.split("px")[0];

if(!TextUtils.isEmpty(color) && !TextUtils.isEmpty(size)){

output.setSpan(new ForegroundColorSpan(Color.parseColor(color)), startIndex, stopIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

output.setSpan(new AbsoluteSizeSpan(Utils.dipToPx(GApp.instance(), Integer.parseInt(size))), startIndex, stopIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

}else{

output.setSpan(new ForegroundColorSpan(0xff2b2b2b), startIndex, stopIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

}

}

final HashMap attributes = new HashMap();

private void processAttributes(final XMLReader xmlReader) {

try {

Field elementField = xmlReader.getClass().getDeclaredField("theNewElement");

elementField.setAccessible(true);

Object element = elementField.get(xmlReader);

Field attsField = element.getClass().getDeclaredField("theAtts");

attsField.setAccessible(true);

Object atts = attsField.get(element);

Field dataField = atts.getClass().getDeclaredField("data");

dataField.setAccessible(true);

String[] data = (String[])dataField.get(atts);

Field lengthField = atts.getClass().getDeclaredField("length");

lengthField.setAccessible(true);

int len = (Integer)lengthField.get(atts);

/**

* MSH: Look for supported attributes and add to hash map.

* This is as tight as things can get :)

* The data index is "just" where the keys and values are stored.

*/

for(int i = 0; i < len; i++)

attributes.put(data[i * 5 + 1], data[i * 5 + 4]);

}

catch (Exception e) {

}

}

}

还有超链接等其他的HTML标签的实现:

哪里错了希望大家用力喷我!!! O(∩_∩)O哈哈~

排版 项目 html,项目需求讨论: 文字显示排版— Html 格式相关推荐

  1. 项目开发 | 转载 | 需求评审与技术评审

    转载自 知乎:项目经验 需求评审与技术评审 ,文字未改,格式有改动. 文章目录 0. 序 1. 需求评审 2. 技术评审 0. 序 做开发应该对需求评审,技术评审并不陌生. 但常有小伙伴抱怨,需求评审 ...

  2. 升级macOS新系统后,Xcode7.2 Xcode7.3.1 在新建项目界面,出现了文字错乱的情况

    在升级macOS新系统后,Xcode7.2  Xcode7.3.1 在新建项目界面,出现了文字错乱的情况. 这种情况在Xcode8.0环境下是显示正常的,但是在7.2  .7.3.1环境下面是出现了错 ...

  3. JeecgBoot轻松解决ERP项目复杂布局需求,JVXETable高性能行表格效果和项目案例

    ERP项目表格布局一般都很复杂,要求大数据.高操作.高性能 ,这个用JeecgBoot如何解决呢? 行编辑无痕刷新,实现鼠标移开即时保存,其他用户数据实时更新并有日历翻牌效果和无痕刷新效果: 行编辑实 ...

  4. 团队项目第二周 - 需求规格说明书 - 天冷记得穿秋裤队

    团队项目第二周 - 需求规格说明书 - 天冷记得穿秋裤队 队员姓名 学号 陈俊旭(组长) 3116004630 夏瓦克提·木合塔尔 3116004658 张婷(副组长) 3216004672 周方源 ...

  5. 学生选课系统项目介绍及需求

    学生选课系统项目介绍及需求 第一天 笔记: 数据库基础知识 主键:Primary Key ,在表中唯一确定该条记录的字段 外键:Foreign Key ,引用(参照)另外一个表中的主键字段 图书表 i ...

  6. 现代IT项目中的需求管理如何做?

    现代IT项目中的需求管理如何做? 领测软件测试网 我们知道现代项目管理的六要素是:时间.成本.质量.组织.范围.客户满意度,实际上,要满足这六个要素,计划一个良好的需求分析是实现这六因素的前提,如果我 ...

  7. 挨踢项目求生法则-需求篇、战略篇以及设计篇

    转自 张传波的博客 摘要: 知道什么是挨踢项目吧?什么!不知道?那IT项目知道了吧?为了不让客户踢.不让老板踢.项目组成员之间不互相踢,俺为大家分享一些减少被踢机会的心得体会.就算不能让项目成功,也至 ...

  8. 9月9日项目群管理活动讨论

    [活动背景] 中国有15万PMP专业人员,但企业项目规模越来越大,投资越来越高,在多项目并行的情况下,项目与战略目标之间存在着一些问题和困扰: 项目投资没有预期的好 资源不能匹配战略 大型项目群管理找 ...

  9. 关于vue+element-ui项目的分页,返回默认显示第一页的问题解决

    关于vue+element-ui项目的分页,返回默认显示第一页的问题解决 参考文章: (1)关于vue+element-ui项目的分页,返回默认显示第一页的问题解决 (2)https://www.cn ...

最新文章

  1. 家庭NAS搭建实战之samba共享
  2. Python 官网宣布,正式发布 Python 3.8.0!
  3. 337. House Robber III 打家劫舍 III
  4. 如何在ubuntu 14.04系统下开启nfs网络文件系统
  5. web操作系统开发的_哪种操作系统更适合Web开发
  6. java重写重定向_JavaWeb请求转发与请求重定向理解
  7. json转string示例_C.示例中的String.Insert()方法
  8. 如何在网页打开CAD,DWG文件,(在线CAD)在线CAD平台,H5前端显示CAD,网页CAD
  9. php令牌桶,令牌桶限频(TokenBucket)
  10. 如何在Microsoft Word 2010中创建自定义封面
  11. git 上传本地项目到githut中
  12. [css] 你有使用过vmax和vmin吗?说说你对它们的理解
  13. 真狗!黑锅竟然让妹子背,你们大厂就是这么对待程序媛的?
  14. 扫福活动开始,你的公众号图文排版也要“福”气满满
  15. the find which you should kown that how to use it
  16. 派件系统c语言实验报告,物流规划与优化选址实验报告.doc
  17. Android AIDL 传递对象(Parceable),深度解读Netty
  18. dds:core:policy
  19. 全球电力行业十大网络安全攻击事件
  20. Hive--下载及配置完整教程

热门文章

  1. Qt Creator 常用快捷键
  2. 比特币现金锚定货币交易所越来越多
  3. Forever +nginx部署Node站点
  4. .NET Core微服务之路:不断更新中的目录 (v0.42)
  5. 不要以为用了云,就不要运维
  6. easyui英文提示变中文
  7. Android移动开发者必须知道的Deep Linking技术
  8. 解决ReSharper自动删除换行
  9. php array_multisort对数据库结果多个字段进行排序
  10. 对tomcat服务的***演示与安全分析