如何在使用 setSpan 时忽略某些单词或字符
How to ignore certain words or characters whilst using setSpan
鉴于我们已经单独返回了一份动物列表:
val animals = "cat, dog and mouse"
然后我们将其连接到我们的 animalsMessage
,因此它看起来如下所示:
val animalsMessage = "You have identified cat, dog and mouse"
鉴于我的默认字体颜色是白色,我只想更改 animalsMessage
中的 val animals
字体颜色,我可以这样做:
animalsMessage.setSpan(
ForegroundColorSpan(resources.getColor(R.color.yellow, null)),
animalsMessage.length - animals.length,
animalsMessage.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
但是,假设我想在跨越时忽略 ,
和单词 and
,所以它们仍然是默认的白色,我该怎么做呢?我提出这个问题的前提是动物字符串中可能有一个 and
并且可能有一个 ,
或多个
我相信答案在于使用模式匹配器,然后在基于找到匹配项进行跨越时忽略。
我尝试过的事情:
首先,在将我的 val animals
连接到我的 val animalsMessage
之前,我尝试如上所述格式化我的 val animals
,为此,我创建了以下方法:
private fun ignoreSeparators(animals: String): SpannableString {
val spannable = SpannableString(animals)
val matcher: Matcher = Pattern.compile(",\\and").matcher(animals)
while (!matcher.matches()) {
val animal = matcher.group(1)
val animalIndex: Int = animals?.indexOf(animal) - 1
spannable.setSpan(ForegroundColorSpan(resources.getColor(R.color.yellow, null)), 0, animalIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
return spannable
}
然后我计划返回跨文本,然后将其连接到我的 val animalsMessage
,但是,我收到一个崩溃消息,提示未找到匹配项。
我建议执行以下操作,首先,删除 ,
和 and
更改为如下列表...
val animals = listOf("cat", "dog", "mouse")
然后,将它们传递给以下将处理样式的方法,然后添加必要的 comma
和 and
。遵循的规则是 and
始终位于最后一只动物和第二只动物之间,无论列表有多大,所有其他值都将用逗号分隔。
第二个参数 prefix 就是我们的 animalsMessage
,我们在您的问题中提到了它。
private fun formatAnimalStrings(animals: List<String>, prefix: String): SpannableStringBuilder {
val lastIndex = animals.size - 1
val secondLastIndex = lastIndex - 1
val result = SpannableStringBuilder(prefix)
animals.forEachIndexed { index, animal ->
val startIndex = result.length
result.append(animals[index])
result.setSpan(
ForegroundColorSpan(resources.getColor(R.color.yellow, null)),
startIndex,
startIndex + animal.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
if (index < lastIndex) {
if (index == secondLastIndex) {
result.append(" and ")
} else {
result.append(", ")
}
}
}
result.append(".")
return result
}
这会导致
You have identified cat, dog and mouse
(我用粗体来表示黄色的文字颜色,因为我不能把文字变成黄色)
鉴于我们已经单独返回了一份动物列表:
val animals = "cat, dog and mouse"
然后我们将其连接到我们的 animalsMessage
,因此它看起来如下所示:
val animalsMessage = "You have identified cat, dog and mouse"
鉴于我的默认字体颜色是白色,我只想更改 animalsMessage
中的 val animals
字体颜色,我可以这样做:
animalsMessage.setSpan(
ForegroundColorSpan(resources.getColor(R.color.yellow, null)),
animalsMessage.length - animals.length,
animalsMessage.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
但是,假设我想在跨越时忽略 ,
和单词 and
,所以它们仍然是默认的白色,我该怎么做呢?我提出这个问题的前提是动物字符串中可能有一个 and
并且可能有一个 ,
或多个
我相信答案在于使用模式匹配器,然后在基于找到匹配项进行跨越时忽略。
我尝试过的事情:
首先,在将我的 val animals
连接到我的 val animalsMessage
之前,我尝试如上所述格式化我的 val animals
,为此,我创建了以下方法:
private fun ignoreSeparators(animals: String): SpannableString {
val spannable = SpannableString(animals)
val matcher: Matcher = Pattern.compile(",\\and").matcher(animals)
while (!matcher.matches()) {
val animal = matcher.group(1)
val animalIndex: Int = animals?.indexOf(animal) - 1
spannable.setSpan(ForegroundColorSpan(resources.getColor(R.color.yellow, null)), 0, animalIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}
return spannable
}
然后我计划返回跨文本,然后将其连接到我的 val animalsMessage
,但是,我收到一个崩溃消息,提示未找到匹配项。
我建议执行以下操作,首先,删除 ,
和 and
更改为如下列表...
val animals = listOf("cat", "dog", "mouse")
然后,将它们传递给以下将处理样式的方法,然后添加必要的 comma
和 and
。遵循的规则是 and
始终位于最后一只动物和第二只动物之间,无论列表有多大,所有其他值都将用逗号分隔。
第二个参数 prefix 就是我们的 animalsMessage
,我们在您的问题中提到了它。
private fun formatAnimalStrings(animals: List<String>, prefix: String): SpannableStringBuilder {
val lastIndex = animals.size - 1
val secondLastIndex = lastIndex - 1
val result = SpannableStringBuilder(prefix)
animals.forEachIndexed { index, animal ->
val startIndex = result.length
result.append(animals[index])
result.setSpan(
ForegroundColorSpan(resources.getColor(R.color.yellow, null)),
startIndex,
startIndex + animal.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
if (index < lastIndex) {
if (index == secondLastIndex) {
result.append(" and ")
} else {
result.append(", ")
}
}
}
result.append(".")
return result
}
这会导致
You have identified cat, dog and mouse
(我用粗体来表示黄色的文字颜色,因为我不能把文字变成黄色)