之前用过SpannableStringBuilder,今天有些时间,于是将这一块总结一下。
前言:
SpannableStringBuilder:
This is the class for text whose content and markup can both be changed.
(这是一个内容和标记都可以更改的文本类)
SpannableStringBuilder有个亲兄弟SpannableString
SpannableStringBuilder和SpannableString之间的关系类似于StringBuilder和String的关系,SpannableStringBuilder可以拼接,而SpannableString不可以。
SpannableStringBuilder和SpannableString都可以设置文本样式,并且SpannableStringBuilder和SpannableString都实现了CharSequence,因此可以直接传入textView的setText中。
主要的方法:
setSpan(Object what, int start, int end, int flags)
SpannableStringBuilder和SpannableString都是通过上述方法来改变文本的样式的。
对应的参数:
start: 指定Span的开始位置
end: 指定Span的结束位置,并不包括这个位置。
flags:取值有如下四个
Spannable. SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式
Spannable. SPAN_INCLUSIVE_INCLUSIVE:前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式
Spannable. SPAN_EXCLUSIVE_EXCLUSIVE:前面不包括,后面不包括
Spannable. SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括
what: 对应的各种Span,不同的Span对应不同的样式。已知的可用类有:
BackgroundColorSpan : 文本背景色
ForegroundColorSpan : 文本颜色
MaskFilterSpan : 修饰效果,如模糊(BlurMaskFilter)浮雕
RasterizerSpan : 光栅效果
StrikethroughSpan : 删除线
SuggestionSpan : 相当于占位符
UnderlineSpan : 下划线
AbsoluteSizeSpan : 文本字体(绝对大小)
DynamicDrawableSpan : 设置图片,基于文本基线或底部对齐。
ImageSpan : 图片
RelativeSizeSpan : 相对大小(文本字体)
ScaleXSpan : 基于x轴缩放
StyleSpan : 字体样式:粗体、斜体等
SubscriptSpan : 下标(数学公式会用到)
SuperscriptSpan : 上标(数学公式会用到)
TextAppearanceSpan : 文本外貌(包括字体、大小、样式和颜色)
TypefaceSpan : 文本字体
URLSpan : 文本超链接
ClickableSpan : 点击事件
实例:
实例一
SpannableStringBuilder style = new SpannableStringBuilder();
content = "<h3><font color='#FB7272'>打败了全国80%的同行,太棒了!</font></h3>\n" +
"你管理的门店3月25日的违规项达到<font color='#FB7272'>358</font>起,其中高风险问题累计<font color='#FB7272'>48</font>起。";
Spanned spanned = Html.fromHtml(content);
String clickString = "查看更多详情>>";
//设置文字
style.append(spanned);
style.append(clickString);
//设置部分文字点击事件
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
Intent intent = new Intent(getActivity(), MoreDetailsAboutTodayAnnouncementActivity.class);
intent.putExtra("date", todayAnnouncementDate);
intent.putExtra("brandId", brandId);
startActivity(intent);
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
};
style.setSpan(clickableSpan, spanned.length(), spanned.length() + clickString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置部分文字颜色
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.selectedColor));
style.setSpan(foregroundColorSpan, spanned.length(), spanned.length() + clickString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//配置给TextView
tv_today_announcement_content.setMovementMethod(LinkMovementMethod.getInstance());
tv_today_announcement_content.setText(style);
注:setMovementMethod(LinkMovementMethod.getInstance()),如果设置了点击事件,这一行代码是必须的。
另外,去掉具有点击功能文字下方的下划线,除了使用上述的方法
@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
以外,我们还可以通过这样子:
@Override
public void updateDrawState(TextPaint ds) {
// super.updateDrawState(ds);
}
即,将父类的updateDrawState的方法实现给注释掉。
实例二
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
String string = "提示:“ ”标识,代表高风险问题。";
spannableStringBuilder.append(string);
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(getResources().getColor(R.color.baseColor4));
spannableStringBuilder.setSpan(foregroundColorSpan, 0, string.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ImageSpan imageSpan = new ImageSpan(this, R.mipmap.warning);
spannableStringBuilder.setSpan(imageSpan, 4, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_hint.setText(spannableStringBuilder);
实现在"提示:“ ”标识,代表高风险问题。"文本中插入一张图片。