SpannableString
1、SpannableString简介
和String类似,不过SpannableString的功能更加丰富强大。给原本枯燥的文本添加各种功能和色彩。比如颜色、字体、超链接、表情、点击响应等功能。源码中关于SpannableString的解释如下:
/ **
*这是用于文本的类,其内容是不可变的,但可以将标记对象附加和分离到该文本。
*有关可变文本,请参见SpannableStringBuilder。
* /2、设置风格:SetSpan()
关于SpannableString源码就70余行,除了几个构造函数,还有一个重要的方法setSpan(Object what, int start, int end, int flags),专门用来给SpannableString设置风格。其中4个参数含义如下:
what :是一个Object对象,用来指定字符串的显示风格(Android已经预定义了大量丰富的Span类,还可以继承已有的进行自定义)
sart :应用此Span的字符串的起始位置
end :应用此Span的字符串的结束位置
flags :有四种形式,就是确定作用空间是否包括收尾。四种值及其含义如下:
//从起始下标到终了下标,包括起始下标
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
//从起始下标到终了下标,同时包括起始下标和终了下标
Spanned.SPAN_INCLUSIVE_INCLUSIVE
//从起始下标到终了下标,但都不包括起始下标和终了下标
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
//从起始下标到终了下标,包括终了下标
Spanned.SPAN_EXCLUSIVE_INCLUSIVE3、常用Span类介绍
Android已经在package android.text.style包中预定义了37个富文本Span类
BackgroundColorSpan 背景色
ClickableSpan 文本可点击,有点击事件
ForegroundColorSpan 文本颜色(前景色)
MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
MetricAffectingSpan 父类,一般不用
RasterizerSpan 光栅效果
StrikethroughSpan 删除线(中划线)
SuggestionSpan 相当于占位符
UnderlineSpan 下划线
AbsoluteSizeSpan 绝对大小(文本字体)
DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
ImageSpan 图片
RelativeSizeSpan 相对大小(文本字体)
ReplacementSpan 父类,一般不用
ScaleXSpan 基于x轴缩放
StyleSpan 字体样式:粗体、斜体等
SubscriptSpan 下标(数学公式会用到)
SuperscriptSpan 上标(数学公式会用到)
TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
TypefaceSpan 文本字体
URLSpan 文本超链接
4、用法示例
先声明一个SpannableString对象,传入String字符串
SpannableString spannableString = new SpannableString(string);在创建一个特定的Span对象,比如这里创建一个URLSpan
URLSpan urlSpan = new URLSpan("https://www.baidu.com");将Span对象setSpan设置给SpannableString对象,开始和起始位置,及flag。
spannableString.setSpan(urlSpan, 10, 20, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);最后将构造好的SpannableString对象,可以直接setText()给TextView等控件。因为SpannableString类也是实现了CharSequence接口
mTextView.setText(spannableString);等等,为什么点击没有反应呢?!这里还有重要的一步给TextView设置setMovementMethod(MovementMethod movement)
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
5、SpannableBuilder
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();进行字符串的拼接
spannableStringBuilder.append(string);设置Span样式,
spannableStringBuilder.setSpan(urlSpan, 10, 20, SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE);SpannableBuilder也可以直接设置给TextView,同样实现了CharSequence接口
mTextView.setText(spannableStringBuilder);
6、自定义Span
已有的Span样式已经很丰富,但是有时候仍不能满足开发中遇到的需求。自定义样式,只需要继承已有的Span样式,重写其中需要的方法即可。
比如自定义一个URLSpan,重写其中的onClick()方法,响应超链接的点击事件。
class MyUrlSpan extends URLSpan {
public MyUrlSpan(String url) {
super(url);
}
public MyUrlSpan(@NonNull Parcel src) {
super(src);
}
@Override
public void onClick(View widget) {
mWebView.loadUrl(getURL());
mWebView.setWebViewClient(new WebViewClient());
}
}相关参考:


评论 (1)
ClickableSpan 去除下划线
点击ClickableSpan默认是有一个下划线的,显得不美观,可以重写其中的updateDrawState(TextPaint ds)方法,去除下划线:
ClickableSpan clickableSpan = new ClickableSpan() { @Override public void onClick(View textView) { } //去除连接下划线 @Override public void updateDrawState(TextPaint ds) { /**set textColor**/ ds.setColor(ds.linkColor); /**Remove the underline**/ ds.setUnderlineText(false); } };