之前做TextView关键字高亮效果,使用的是Html.fromHtml(String source)方法,然后通过TextView的setText(CharSequence text)方法来显示
后来测试此方法在部分手机上显示有问题,如Nexus4,华为P6等等。于是乎只能继续寻找别的解决办法了,在这里Mark一下。
这里用到了SpannableString类
使用 SpannableString.setSpan(Object what, int start, int end, int flags)方法
1、创建超链接
[java] view plain copy
1. /**
2. * 创建一个超链接
3. */
4. private void createLink() {
5. // 创建一个 SpannableString对象
6. new SpannableString("百度手机卫士");
7. // 设置超链接
8. new URLSpan("http://www.baidu.com"), 0, 2,
9. Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
10.
11. tv_content1.setText(sp);
12. //设置TextView可点击
13. tv_content1.setMovementMethod(LinkMovementMethod.getInstance());
14. }
2、高亮某一段文字的背景
[java] view plain copy
1. //高亮背景颜色
2. private void backgroundHight(){
3. // 创建一个 SpannableString对象
4. new SpannableString("祝大家新年快乐");
5. //设置背景颜色
6. new BackgroundColorSpan(Color.RED), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
7. tv_content2.setText(sp);
8. //设置TextView可点击
9. tv_content2.setMovementMethod(LinkMovementMethod.getInstance());
10. }
3、高亮某段文字
[java] view plain copy
1. //高亮字体颜色
2. private void foregroundHight(){
3. // 创建一个 SpannableString对象
4. new SpannableString("祝大家新年快乐");
5. //设置背景颜色
6. new ForegroundColorSpan(Color.parseColor("#ff6600")), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
7. // sp.setSpan(new ForegroundColorSpan(Color.YELLOW), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
8. tv_content3.setText(sp);
9. //设置TextView可点击
10. tv_content3.setMovementMethod(LinkMovementMethod.getInstance());
11. }
4、设置斜体
[java] view plain copy
1. //斜体
2. private void boldItalicHight(){
3. // 创建一个 SpannableString对象
4. new SpannableString("新年快乐天天开心 哈哈哈哈哈哈");
5. // SpannableString sp = new SpannableString("Happy New Year 天天开心 哈哈哈哈哈哈");
6. //设置背景颜色
7. new StyleSpan(Typeface.BOLD_ITALIC), 6 ,10,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
8. tv_content4.setText(sp);
9. //设置TextView可点击
10. tv_content4.setMovementMethod(LinkMovementMethod.getInstance());
11. }
这里设置的斜体只对 英文起作用,汉字没有斜体效果,如果有人知道原因,麻烦在下面回复我一下,谢谢!
5、设置下划线
[java] view plain copy
1. //下划线
2. private void underLineHight(){
3. // 创建一个 SpannableString对象
4. new SpannableString("祝大家新年快乐");
5. //设置背景颜色
6. new UnderlineSpan(), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
7. tv_content5.setText(sp);
8. //设置TextView可点击
9. tv_content5.setMovementMethod(LinkMovementMethod.getInstance());
10. }
6、设置中划线
[java] view plain copy
1. //中划线
2. private void strikethroughHight(){
3. // 创建一个 SpannableString对象
4. new SpannableString("祝大家新年快乐");
5. //设置背景颜色
6. new StrikethroughSpan(), 3 ,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
7. tv_content6.setText(sp);
8. //设置TextView可点击
9. tv_content6.setMovementMethod(LinkMovementMethod.getInstance());
10. }
7、高亮一段文字中指定的全部关键字
[java] view plain copy
1. /**
2. * 高亮某个关键字,如果有多个则全部高亮
3. */
4. private void highlightKeyword() {
5.
6. "KTV风暴KTV";
7. new SpannableString(str);
8.
9. "KTV");
10. Matcher m = p.matcher(str);
11.
12. while (m.find()) { //通过正则查找,逐个高亮
13. int start = m.start();
14. int end = m.end();
15. new ForegroundColorSpan(Color.parseColor("#ff6600")), start ,end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
16. }
17. tv_content7.setText(sp);
18. }
运行效果