在Android应用开发中使用TextView控件展示一些文字内容时可能会遇到一些特别的需求,比如希望用特殊的字体或颜色标示出一段文字中的某些文字,一般开发者很容易想到用多个TextView控件把具有不同显示样式的文字拼接起来,这样能够实现,但是相对比较麻烦一些,而且扩展性和显示效果都不一定很好。本文是结合我在实际工作中遇到的需求的解决办法和我对这个问题的一点调查总结形成的博文,以备以后查阅。
实现方法
要实现一段文字中部分文字内容的字体大小颜色与众不同的需求,一般有三种实现方式:
1、使用多个TextView拼接
2、使用html标签定义文字内容,用Html.fromHtml()方法解析后设置给TextView控件
3、使用Spannable对象动态设置文字的大小和颜色
使用多个TextView控件来依次拼接具有不同属性的文字,这种方法没有什么特别的,只需要正确地设置TextView的各种属性就可以实现需求。下面分别说说Html标签和Spannable的使用。
Html标签设置字体大小、颜色
Android SDK中提供了一个Html类用来解析HTML格式的字符串用于显示,所以可以通过Html标签来设置文字的显示属性,不过这个Html类并不支持所有的Html标签。
/**
* This class processes HTML strings into displayable styled text.
* Not all HTML tags are supported.
*/
public class Html {
……
/**
* Returns displayable styled text from the provided HTML string.
* Any <img> tags in the HTML will display as a generic
* replacement image which your program can then go through and
* replace with real images.
*
* <p>This uses TagSoup to handle real HTML, including all of the
* brokenness found in the wild.
*/
public static Spanned fromHtml(String source) {
return fromHtml(source, null, null);
}
/**
* Returns displayable styled text from the provided HTML string.
* Any <img> tags in the HTML will use the specified ImageGetter
* to request a representation of the image (use null if you don't
* want this) and the specified TagHandler to handle unknown tags
* (specify null if you don't want this).
*
* <p>This uses TagSoup to handle real HTML, including all of the
* brokenness found in the wild.
*/
public static Spanned fromHtml(String source, ImageGetter imageGetter,
TagHandler tagHandler) {
//implementation code
}
……
}
代码示例
TextView textView = (TextView) findViewById(R.id.text_for_test);
String textSource = "修改TextView中部分文字的<font color='#ff0000'><big>大</big><small>小</small></font>和<font color='#00ff00'>颜色</font>,展示多彩效果!";
textView.setText(Html.fromHtml(textSource));
显示效果如下
我们也可以把要显示的文本加到strings.xml文件里面,不过我们需要注意对<、>、'、"这些字符进行转换,因为它们四个是HTML的标签,放到xml文件中需要对其进行转义。具体来说,左括号< 要用 <
代替,右括号> 要用 >
代替,单引号和双引号要用 \ 进行转义。
在strings.xml中定义文字内容:
<string name="partly_colored_text">修改TextView中部分文字的<font color=\'#ff0000\'> <big>大</big> <small>小</small> </font>和<font color=\'#00ff00\'>颜色</font>,展示多彩效果!</string>
在Java代码中调用:
textView.setText(Html.fromHtml(getString(R.string.partly_colored_text)));
两种实现方式效果一样,同上图片。
Spannable
Spannable是android.text包下的一个关于文字样式处理的接口类,可以给文字添加或者去除一些显示样式,有三个类实现了Spannable,其中Editable也是一个接口,由SpannableStringBuilder最终实现,Spannable本身实现了Spanned接口,在Android SDK中的类结构关系如下图。
Spannable接口继承了Spanned接口,而后者又继承了CharSequence接口,所以通过实例化Spannable对象我们可以为一个字符串添加各种显示样式,可添加的字符样式包括抽象类CharacterStyle的各个可实例化子类提供的样式。
实例化SpannableString对象并通过它的方法setSpan(Object what, int start, int end, int flags)便可以构造带有我们需要的显示样式的Spanned对象,然后将这个对象传入TextView的setText方法即可让目标字符串显示为设置的样式。这里setSpan方法中what就是SDK中提供的各种CharacterStyle对象;start和end是设置这个样式针对的textview中的字符起止位置;flags是Spanned类中定义的几种标志,用来表示是否要将前面设置的起点或终点位置设置成what标示的样式。这些flags大概的意思如下
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE (前后都不包括)
Spanned.SPAN_INCLUSIVE_EXCLUSIVE (前面包括,后面不包括)
Spanned.SPAN_EXCLUSIVE_INCLUSIVE (前面不包括,后面包括)
Spanned.SPAN_INCLUSIVE_INCLUSIVE (前后都包括)
小结
灵活应用Spannable可以实现非常多酷炫的TextView显示效果,本文没有写代码演示各种TextView样式的效果,下面最后一个链接的文章给出了一些效果的用法示例,非常不错,参考之;第二个链接地址中作者给出了一个使用Spannable的工具类,挺方便实用的。