當你第一眼看到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
所代表的文本是不可改變的,所以不能插入字符串