之前做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);
}
运行效果