android - 如何在使用 setSpan 时忽略某些单词或字符
问题描述
鉴于我们已经单独返回了动物列表:
val animals = "cat, dog and mouse"
然后我们将其连接到我们的animalsMessage
,所以它看起来如下:
val animalsMessage = "You have identified cat, dog and mouse"
鉴于我的默认字体颜色是白色,我只想更改我的val animals
字体颜色animalsMessage
,我可以这样做:
animalsMessage.setSpan(
ForegroundColorSpan(resources.getColor(R.color.yellow, null)),
animalsMessage.length - animals.length,
animalsMessage.length,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
但是,假设我想在跨越时忽略,
and 这个词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
总是在最后一个和倒数第二个动物之间,并且无论列表有多大,所有其他值都将用逗号分隔。
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
}
这将导致
你已经认出了猫、狗和老鼠
(我用粗体表示黄色文本颜色,因为我不能使文本黄色)
推荐阅读
- python - XGBoost 对列表与数组的预测略有不同,这是正确的吗?
- php - mysqli_real_escape_string 没有转义字符串
- ffmpeg - 通过 FFMPEG 平滑 FPS 变化
- matlab - Matlab Image Segmenter morphology
- rust - 从 Rust 中的 Vec 中删除一系列值?
- macos - OSX 活动监视器与平均负载
- android - Visual Studio Code 中的 build.gradle 错误(Flutter)
- firebase - Firebase 消息传递 - 实施 Vapid 后使用 Curl 进行测试
- nativescript - Nativescript:Hello World 演示无法构建
- webpack - webpack 尝试从错误的路径加载文件