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