当你第一眼看到Spannable
标志的EXCLUSIVE
和INCLUSIVE
时,我以为他们只是代表着各种样式span是否包含SpannableString
中指定的开始和结束的索引位置,但事实证明这种想法是错误的,我们可以用下面的例子证明它
val myString = "01234"
val start = 1
val end = 3
val spanFlag = Spannable.SPAN_EXCLUSIVE_INCLUSIVE
val spannableString = SpannableString(myString)
val colorSpan = ForegroundColorSpan(Color.RED)
spannableString.setSpan(colorSpan, start, end, spanFlag)
textView.text = spannableString
下面是结果,经过验证,不过是哪种Flag,始终都是包括开始索引不包括结束索引
Spannable.SPAN_INCLUSIVE_INCLUSIVE
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
Spannable.SPAN_EXCLUSIVE_INCLUSIVE
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
那这些flags究竟是什么意思呢
Spannable
标志的INCLUSIVE
和EXCLUSIVE
实际上是说明样式span是否能够影响在开始位置和结束位置插入的文本,下面用修改过的demo证明它
val myString = "01234"
val start = 1
val end = 3
val spanFlag = Spannable.SPAN_INCLUSIVE_INCLUSIVE
val spannableString = SpannableStringBuilder(myString)
val colorSpan = ForegroundColorSpan(Color.RED)
spannableString.setSpan(colorSpan, start, end, spanFlag)
spannableString.insert(end,"zz")
spannableString.insert(start,"xx")
textView.text = spannableString
Spannable.SPAN_INCLUSIVE_INCLUSIVE
Spannable.SPAN_INCLUSIVE_EXCLUSIVE
Spannable.SPAN_EXCLUSIVE_INCLUSIVE
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
在第二个例子里使用了SpannableStringBuilder
,这是因为SpannableString
所代表的文本是不可改变的,所以不能插入字符串