TextView mTextView; String str = "<font color='red'><b>知道螃蟹为什么横着走吗?</b></font> <font color='blue'><b>因为有钱,所以任性。</b></font>"; mTextView.setText(Html.fromHtml(str));
String strs="红色打电话粗体删除线绿色下划线图片:.超链接红色背景色斜体"; SpannableString ss = new SpannableString( strs); ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ss.setSpan(new URLSpan("tel:4155551212"), 2, 5,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ss.setSpan(new StyleSpan(Typeface.BOLD), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ss.setSpan(new StrikethroughSpan(), 7, 10,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ss.setSpan(new UnderlineSpan(), 10, 16,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ss.setSpan(new ForegroundColorSpan(Color.GREEN), 10, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); Drawable d = getResources().getDrawable(R.drawable.icon48x48_1); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight()); ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE); ss.setSpan(span, 18, 19, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); ss.setSpan(new URLSpan("http://www.baidu.com"), 19, 22,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); sp.setSpan(new BackgroundColorSpan(Color.RED), 22 ,26,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 26, 28, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); TextView t4 = (TextView) findViewById(R.id.text4); t4.setText(ss); t4.setMovementMethod(LinkMovementMethod.getInstance());
运行结果:
参数说明:即在原文本尾追加新文本的样式受原文本样式影响,原来文本尾高亮,新追加文本也高亮。看个截图就更明白了:
简单例子(实现文字高亮,点击响应点击事件)
下面是一个20行的完整Demo代码:基本原理是使用一个SpannableString并设置其ClickableSpan来响应点击事件。 TextView useInfo = (TextView) findViewById(R.id.info); String url_0_text = "用户协议及隐私条款"; useInfo.setText("开始即表示您同意遵守"); SpannableString spStr = new SpannableString(url_0_text); spStr.setSpan(new ClickableSpan() { @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(Color.WHITE); //设置文件颜色 ds.setUnderlineText(true); //设置下划线 } @Override public void onClick(View widget) { Log.d("", "onTextClick........"); } }, 0, url_0_text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); useInfo.setHighlightColor(Color.TRANSPARENT); //设置点击后的颜色为透明,否则会一直出现高亮 useInfo.append(spStr); useInfo.setMovementMethod(LinkMovementMethod.getInstance());//开始响应点击事件
在项目开发者,经常需要把资源文件定义字符串和设置颜色结合起来使用。可以避免很多textview的拼接,如下所示:
res字符串文件定义: <string name="baoxiang">您今天打了%1$d局,还差%2$d局可获得%3$s!</string>
TextView textView = (TextView)findViewById(R.id.testview);
String text = String.format(getResources().getString(R.string.baoxiang), 2,18,"银宝箱");
int index[] = new int[3];
index[0] = text.indexOf("2");
index[1] = text.indexOf("18");
index[2] = text.indexOf("银宝箱");
SpannableStringBuilder style=new SpannableStringBuilder(text);
style.setSpan(new ForegroundColorSpan(Color.RED),index[0],index[0]+1,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
style.setSpan(new ForegroundColorSpan(Color.RED),index[1],index[1]+2,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
style.setSpan(new BackgroundColorSpan(Color.RED),index[2],index[2]+3,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
textView.setText(style);