SpannableStringBuilder 追加一个 SpannableString 对象不显示跨度?

问题描述

我正在尝试使用 SpannableStringBuilder 为句子中所有出现的给定字符序列实现可跨越颜色,就像:

val spannableStr1 = SpannableString("Hello World!")
spannableStr1.setSpan(ForegroundColorSpan(Color.parseColor("#FF0000")),3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
val spannableBuilder = SpannableStringBuilder()
spannableBuilder.append(spannableStr1)
spannableBuilder.append(spannableStr1)
tvDemo.text = spannableBuilder

这导致:

enter image description here

我需要第二次出现的字符 hel 也是红色的。所以我再次尝试附加spannableStr1,但似乎不起作用。

有什么办法可以实现吗?

解决方法

spannableStr1 上的跨度设置为 0-3。不幸的是,一旦您第二次将它添加到可跨字符串构建器中,它仍然是 0-3。这导致了这里的问题 - 您将同一部分涂成红色两次。

这样做的更好方法是不向文本添加跨度。相反,只需附加文本并将跨度直接添加到 SpannableStringBuilder。这意味着第一个跨度应该是(0,3),第二个应该是(第二个 h 的索引,第二个 h 的索引 + 3)

val spannableStr1 ="hello world!"
val spannableBuilder = SpannableStringBuilder()
spannableBuilder.append(spannableStr1)
spannableBuilder.append(spannableStr1)
spannableBuilder.setSpan(ForegroundColorSpan(Color.parseColor("#FF0000")),3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
spannableBuilder.setSpan(ForegroundColorSpan(Color.parseColor("#FF0000")),spannableStr1.length,spannableStr1.length + 3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
tvDemo.text = spannableBuilder

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...