Android基础-学习Spannable使用

481 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

Spannable用途

Android开发中离不开文本输入,在文本输入中会存在需要对一段文字做高亮显示加重突出。例如希望实现富文本内容展示就离不开Spannable。开发者可以通过TextView来展示文本内容颜色、大小、样式、超链接跳转以及文本内插入图片功能使得TextView表现形式更加丰富多彩。

image.png

Spannable介绍

首先介绍SpannableStringBuilderSpannableString这两个类实际上和String差不多,用于存储字符串对象。主要区别在与SpannableStringBuilderSpannableStringsetSpan方法能且都是Spannable为文本添加样式(Span)而生。接着说下SpannableStringBuilderSpannableString的区别。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配置上确实是在未插入新字段所有作用效果是一样的。

cd21dfb249796301fdca5b6ab0124ae5.jpg 当在前后分别插入xy字符时会发现不同flags配置呈现效果上存在差异。 c7f09ee72c18ae8e74a93a4158ccc16c.jpg