背景:通常APP 登陆注册时,下方我们都会放一行提示语: 如果你注册或登录则表示同意 《xx 安全隐私协议》。
《xx 安全隐私协议》
一般都是高亮的。
正文
一般来说有N种方式来实现这个效果。
不管是Html,还是自定义TextView
,或者是SpannableString
都可以。
如果使用了语言国际化不推荐使用SpannableString
。
不同语言的字符集长度是不一样的。我这里就没用
但以上都只适用与你不引入<>
符号
我是用了html 代码来实现效果,但是产品经理要求将《》
换成<>
虽然我知道英语没有书名号,不知道是不是泰语有。反正我得先给他换好
进坑
- 1号坑
string.xml
文件中无法用转义字符来转义<
例:
<string name="customer_service_agreement"> \<Customer service agreement\></string>
看这颜色标注你就知道不通过。
上面格式会报错 属性不合法,那也就是不能直接使用< >
这两个符号了
- 2号坑
在html
代码中用字符串拼接\< \>
,无效
例:
String agreement =findStringById(R.string.agreement);//无<>符号
String html = "<font color=\"#E40000\">\<"+agreement+"\></font>"
tv.setText(Html.fromHtml(html));
没用x1
但经我测试,这段代码在Web浏览器中是可以显示出正确结果的。
- 3号坑
既然上面都不行,那我用html
字符编码,这样总可以避开格式化失败了吧。
< >
的字符实体编号是<
和>
<string name="customer_service_agreement"><Customer service agreement <</string>
String agreement =findStringById(R.string.agreement);//无<>符号
String html = "<font color=\"#E40000\">"+agreement+"</font>"
tv.setText(Html.fromHtml(html));
运行结果应该是格式化失败了,毛都不显示一个。
没用x2
此时,我的心态!
OK,冷静,冲动是程序员的大忌,后面还有方法可用。
转而我又在xml
中使用了 < >
对应的字符实体名称 <
和 >
没用x3 WTF~FFF
在java
中又试了 字符实体编号
没用x4 WTF~FFF
在java
中又试了 字符实体名称
没用x? GOD IT'S FUCKING WORK
所以在文本部分高亮时使用特殊字符 < >
,正确的打开方式应该是这样的
String html = "<font color=\"#999999\">"+content+"</font> " +
"<font color=\"#E40000\"><" + agreement + "></font>"
;
我这里只针对< >
,如果有其他不可在xml 中直接使用转义字符的,都可以这样使用。
另外提一点,单独在xml
使用 实体字符编号(>
->
)是不会有问题的,这里只不过是格式化成Html以后错误了。
别问我还有哪些,等你遇到就知道了 哈哈
最后附上 HTML 特殊字符实体名称及编号表:
本文参考HTML 字符实体