SpannableStringBuilder 与 SpannableString 的区别就和 String 与 StringBuilder 的区别类似。SpannableStringBuilder 可以使用 append() 方法拼接,而 SpannableString 不可拼接。其他没有多大区别。其实,大部分场景用 SpannableString 就能应付得来,但当一次性需要在头部嵌入多种样式时,SpannableStringBuilder 特有的 insert() 方法就能起到很好的效果:
代码:
mTextView = (TextView) findViewById(R.id.tv);
String tvContent = "很骚气的一连串替换";
CommonTextSpan textSpan = new CommonTextSpan.Builder(SizeUtil.dip2px(this, 15))
.setTextColor(Color.RED)
.setTextSize(SizeUtil.sp2px(this, 10))
.setTextPadding(SizeUtil.dip2px(this, 5))
.setBgRadius(SizeUtil.dip2px(this, 2))
.setBgMarginTop(SizeUtil.dip2px(this, 2))
.setIntervalWidth(SizeUtil.dip2px(this, 5))
.setBgStroke(Color.RED, 1)
.build();
CommonIconSpan iconSpan = new CommonIconSpan.Builder(this, R.mipmap.ic_launcher, SizeUtil.dip2px(this, 14))
.setIconBgMarginTop(SizeUtil.dip2px(this, 2))
.setIconIntervalWidth(SizeUtil.dip2px(this, 5))
.build();
CommonTextSpan textBgGradientSpan = new CommonTextSpan.Builder(SizeUtil.dip2px(this, 15))
.setTextColor(Color.RED)
.setTextSize(SizeUtil.sp2px(this, 10))
.setTextPadding(SizeUtil.dip2px(this, 5))
.setBgRadius(SizeUtil.dip2px(this, 2))
.setBgMarginTop(SizeUtil.dip2px(this, 2))
.setIntervalWidth(SizeUtil.dip2px(this, 5))
.setBgGradient(Color.RED, Color.BLUE)
.build();
LinkedList<ReplacementSpan> charSequenceList = new LinkedList<>();
LinkedList<String> contentList = new LinkedList<>();
charSequenceList.add(textSpan);
contentList.add("哈哈");
charSequenceList.add(iconSpan);
contentList.add(" ");
charSequenceList.add(textBgGradientSpan);
contentList.add("靓丽");
setTitleTag(mTextView, tvContent, charSequenceList, contentList);
public void setTitleTag(TextView textView, String tvContent,
LinkedList<ReplacementSpan> charSequenceList, LinkedList<String> contentList) {
if (charSequenceList.isEmpty()) {
textView.setText(tvContent);
} else {
SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(tvContent);
while (!charSequenceList.isEmpty()) {
String content = contentList.pollLast();
ReplacementSpan span = charSequenceList.pollLast();
SpannableString spannableString = new SpannableString(content);
spannableString.setSpan(span, 0, content.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableStringBuilder.insert(0, spannableString);
}
textView.setText(spannableStringBuilder);
}
}