如何在使用 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,所以它们仍然是认的白色,我该怎么做?我提出这个问题的假设是,animals 字符串中可能有一个 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,animalIndex,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
    }
    return spannable
}

然后我计划返回跨区文本,然后将其连接到我的 val animalsMessage,但是,我收到一个崩溃消息,说找不到匹配项。

解决方法

我建议执行以下操作,首先,将 ,and 更改删除到列表中,如下所示...

 val animals = listOf("cat","dog","mouse")

然后,将它们传递给以下处理样式的方法,然后添加必要的 commaand。遵循的规则是 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
    }

这会导致

您已经确定了老鼠

(我用粗体来表示黄色的文字颜色,因为我不能把文字变成黄色)

相关问答

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