Android-TextView设置部分高亮-字符坑

Android-TextView设置部分高亮-字符坑_第1张图片
样图.png

背景:通常APP 登陆注册时,下方我们都会放一行提示语: 如果你注册或登录则表示同意 《xx 安全隐私协议》。《xx 安全隐私协议》一般都是高亮的。

正文

一般来说有N种方式来实现这个效果。
不管是Html,还是自定义TextView,或者是SpannableString都可以。
如果使用了语言国际化不推荐使用SpannableString
不同语言的字符集长度是不一样的。我这里就没用
但以上都只适用与你不引入<>符号

我是用了html 代码来实现效果,但是产品经理要求将《》换成<>
虽然我知道英语没有书名号,不知道是不是泰语有。反正我得先给他换好

进坑

  • 1号坑
    string.xml文件中无法用转义字符来转义<
    例:
   \

看这颜色标注你就知道不通过。
上面格式会报错 属性不合法,那也就是不能直接使用< >这两个符号了

  • 2号坑
    html代码中用字符串拼接\< \>,无效
    例:

  String agreement =findStringById(R.string.agreement);//无<>符号
  String html  = "\<"+agreement+"\>"
  tv.setText(Html.fromHtml(html));

没用x1
但经我测试,这段代码在Web浏览器中是可以显示出正确结果的。

  • 3号坑
    既然上面都不行,那我用html字符编码,这样总可以避开格式化失败了吧。
    < >的字符实体编号是 <>
 

  String agreement =findStringById(R.string.agreement);//无<>符号
  String html  = ""+agreement+""
  tv.setText(Html.fromHtml(html));

运行结果应该是格式化失败了,毛都不显示一个。

没用x2

此时,我的心态!
OK,冷静,冲动是程序员的大忌,后面还有方法可用。
转而我又在xml 中使用了 < >对应的字符实体名称 <>

没用x3 WTF~FFF

java中又试了 字符实体编号
没用x4 WTF~FFF

java中又试了 字符实体名称
没用x? GOD IT'S FUCKING WORK

所以在文本部分高亮时使用特殊字符 < >,正确的打开方式应该是这样的

 String html  = ""+content+" " +
                "<" + agreement + ">"
                ;

我这里只针对< >,如果有其他不可在xml 中直接使用转义字符的,都可以这样使用。
另外提一点,单独在xml使用 实体字符编号(> ->)是不会有问题的,这里只不过是格式化成Html以后错误了。

别问我还有哪些,等你遇到就知道了 哈哈

最后附上 HTML 特殊字符实体名称及编号表:

Android-TextView设置部分高亮-字符坑_第2张图片
特殊字符实体名称及编号.png

本文参考HTML 字符实体

你可能感兴趣的:(Android-TextView设置部分高亮-字符坑)