引言
在应用程序开发过程经常需要对文本进行处理,比如说对一段描述文字的其中一段加入点击事件,或者对其设置不一样的前景色,有什么方法可以实现要求的功能呐?
需求样例
比如我们需要实现如下图所示的功能,将文本:#重磅消息#近日谷歌放出Android N的第二个开发者预览版(Developer Preview) 处理成第二种或者第三种的形式。
实现方案
根据上图,我们可以采用如下的方法来实现上诉要求的效果。
方案1
比如显示效果二你可以能会说,我们可以采用三个TextView来实现,第一个TextView设置不一样的颜色,第二个正常显示内容,第三个处理点击事件。该方式对图二可能是能够实现的,但是如果第二行里面就有部分内容需要进行点击处理,就比较难以实现了。
对于图三的效果上述的方式就很难实现了。必须要对TextView的内容进行处理了!!
方案2
如果文案的处理只是简单的对齐,颜色,大小的变换,我们还可以采用自定义view来实现,在前面的文章中我们就采用了自定义view来显示了一个文字的排版效果,具体实现可以查看Android文本排版实现;
方案3
除了上面的方案,我们还可以采用另外一个种方式来实现,采用html来显示,可以将要显示的内容转换成html的格式,用TextView来进行加载。说了这么多,我们来看看代码吧!
private void setText() {
String originText = "#重磅消息#近日谷歌放出Android N的第二个开发者预览版(Developer Preview)";
String effect1 = "<font color='#FF0000'>#重磅消息#</font> <br> 近日谷歌放出Android " +
"N的第二个开发者预览版<a href='http://developer.android.com/index.html'>(Developer Preview)</a>";
String effect2 = "<font color='#303F9F'>#重磅消息#</font> 近日谷歌放出Android " +
"N的第二个开发者预览版<a href='http://developer.android.com/index.html'>(Developer Preview)</a>";
StringBuilder sb = new StringBuilder(originText);
sb.append("<br><br><br><br>");
sb.append(effect1);
sb.append("<br><br><br><br>");
sb.append(effect2);
textView.setText(Html.fromHtml(sb.toString()));
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
写到这,突然发现要跑题,仅仅是Html的实现就可以分析出很多的知识点,不过这里还是先契合主题,先这里挖一个坑,后续对html进行分析,Android Html
解析
方案4
终于回到我们的主题了,这里我们采用SpannableString来实现上述的效果。代码如下:
private void setSpan() {
String originText = "#重磅消息#近日谷歌放出Android N的第二个开发者预览版(Developer Preview)";
SpannableStringBuilder sb = new SpannableStringBuilder(originText);
sb.append("\r\n").append("\r\n").append("\r\n");
getEffect1Span(sb);
sb.append("\r\n").append("\r\n").append("\r\n");
getEffect2Span(sb);
textView.setText(sb);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
private void getEffect1Span(SpannableStringBuilder sb) {
String source1 = "#重磅消息#"