持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
Spannable用途
Android开发中离不开文本输入,在文本输入中会存在需要对一段文字做高亮显示加重突出。例如希望实现富文本内容展示就离不开Spannable。开发者可以通过TextView来展示文本内容颜色、大小、样式、超链接跳转以及文本内插入图片功能使得TextView表现形式更加丰富多彩。
Spannable介绍
首先介绍SpannableStringBuilder和SpannableString这两个类实际上和String差不多,用于存储字符串对象。主要区别在与SpannableStringBuilder和SpannableString有setSpan方法能且都是Spannable为文本添加样式(Span)而生。接着说下SpannableStringBuilder和SpannableString的区别。SpannableString是固定不变的,固定文本之后无法再更改文本也无法再拼接。而SpannableStringBuilder是可以通过append方法和insert方法继续拼接文本。
SpannableString spannableString new SpannableString("固定文本了");
SpannableStringBuilder spannableString2 = new SpannableStringBuilder();
spannableString2.append("固定文本");
spannableString2.append("继续添加");
spannableString2.append("再继续添加");
Spannable使用
Spannable使用过程中主要方法是setSpan(Object what, int start, int end, int flags)。
Object:waht
对应各种Span,例如ForegroundColorSpan、ForegroundColorSpan、TextClickableSpan等。实现文本各种效果的样式配置。
int:start和int:end
表示Span样式的作用域,其中是start下标是包含关系,end下标是非包含关系。举例字符串123456,start=1和end=3那么Span样式作用在字符23上。
int:flags
该标记位要注意的是针对插入新字符的作用样式,例如使用SpannableStringBuilder用来控制Span样式是否也作用效果。
PS:原错误认为该标记位与start和end是结合使用的😭
- SPAN_INCLUSIVE_EXCLUSIVE: 前包含后不包含
- SPAN_INCLUSIVE_INCLUSIVE: 前包含后包含
- SPAN_EXCLUSIVE_EXCLUSIVE: 前不包含后不包含
- SPAN_EXCLUSIVE_INCLUSIVE: 前不包含后包含
练习小试牛刀
ForegroundColorSpan是为文本段落添加颜色,采用SPAN_INCLUSIVE_EXCLUSIVE作用。
var text = "123456"
private fun content(flags: Int): SpannableStringBuilder {
return SpannableStringBuilder(text).also {
// start 包含 end不包含
it.setSpan(
ForegroundColorSpan(Color.parseColor("#ff1f50")),
2,
3,
flags
)
}
}
tvIE.text = content(Spannable.SPAN_INCLUSIVE_EXCLUSIVE)
从flags配置上确实是在未插入新字段所有作用效果是一样的。
当在前后分别插入
x和y字符时会发现不同flags配置呈现效果上存在差异。