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
相关产品推荐
相关产品推荐

