如何修改Android TextView控件中指定字符串的显示颜色
实现方案
完全可以仅修改TextView的部分文本颜色,下面提供两种适配你需求的实现方式:
方案1:HTML标签拼接(完全匹配你想要的拼接写法需求)
Android TextView原生支持解析基础HTML标签,无需引入第三方HTML库,直接在拼接字符串时给需要改色的部分包裹<font>标签即可,不会修改全局文本颜色,仅作用于标签包裹的内容。
示例代码(Kotlin)
// 预先配置用户名对应的色值,可按需调整 val colorMapping = mapOf( "Tom" to "#FF0000", "Jack" to "#00FF00", "Sam" to "#0000FF" ) var htmlText = "" // 遍历JSON键值对拼接内容 jsonObject.keys().forEach { username -> val msgContent = jsonObject.getString(username) // 按你需要的方式拼接,仅给用户名套颜色标签 htmlText += "<font color='${colorMapping[username]}'>$username</font>: $msgContent<br/>" } // 处理后设置给TextView textView.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { Html.fromHtml(htmlText, Html.FROM_HTML_MODE_LEGACY) } else { Html.fromHtml(htmlText) }
注意事项
- 直接调用系统自带的
android.text.Html类即可,不会出现第三方库修改全局颜色的问题 - 换行需要用
<br/>标签替代普通\n才能正常解析
方案2:SpannableStringBuilder实现(性能更优,支持扩展更多样式)
如果后续需要给文本加点击事件、粗体、斜体等更多样式,推荐用原生Spannable实现,无需解析HTML,性能更好:
示例代码(Kotlin)
val spannableBuilder = SpannableStringBuilder() val colorMapping = mapOf( "Tom" to Color.RED, "Jack" to Color.GREEN, "Sam" to Color.BLUE ) jsonObject.keys().forEach { username -> val msgContent = jsonObject.getString(username) val startPos = spannableBuilder.length spannableBuilder.append("$username: $msgContent\n") // 仅给用户名部分设置颜色 spannableBuilder.setSpan( ForegroundColorSpan(colorMapping[username]!!), startPos, startPos + username.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ) } textView.text = spannableBuilder
内容的提问来源于stack exchange,提问作者GLHF
相关产品推荐
相关产品推荐

