首页 > 解决方案 > 如何在使用 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,但是,我得到一个崩溃,说没有找到匹配项。

标签: androidkotlinspannablestring

解决方案


我建议执行以下操作,首先,删除,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
    }

这将导致

你已经认出了老鼠

(我用粗体表示黄色文本颜色,因为我不能使文本黄色)


推荐阅读