You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中ForegroundColorSpan多词着色失效:仅最后一个生效求助

问题分析与解决方案

你遇到的这个问题其实是Spannable机制的一个常见坑——同一个Span对象不能被重复添加到SpannableString中。

当你在循环里反复调用spannableString.setSpan(colorSpan, ...)时,并不是给每个单词都添加了独立的颜色标记,而是不断修改同一个Span对象的作用范围。每次调用setSpan都会覆盖之前的设置,最后自然只有最后一次的范围生效。

修复后的代码

只需要在循环内部每次创建新的ForegroundColorSpan实例即可:

private fun formatString(target: String, vararg formattableWords: String): SpannableString {
    val spannableString = SpannableString(target)
    val colorRes = R.color.colorPrimary
    formattableWords.forEach { formattableWord ->
        val start = target.indexOf(formattableWord, ignoreCase = true)
        if (start != -1) { // 避免找不到单词时出现索引错误
            val end = start + formattableWord.length
            // 每次循环都创建新的Span对象
            val colorSpan = ForegroundColorSpan(ContextCompat.getColor(context!!, colorRes))
            spannableString.setSpan(colorSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
        }
    }
    return spannableString
}

额外优化点

我还加了if (start != -1)的判断,防止传入的单词在目标字符串中不存在时,出现start = -1导致end计算出错的问题,让代码更健壮。

这样修改后,"APP"、"Terms and Conditions"和"Privacy Policy"这三个单词都会正确显示你设置的colorPrimary颜色了。

内容的提问来源于stack exchange,提问作者malhobayyeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:49:39