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

strings.xml内HTML标签在Kotlin中失效,Java正常,求原因

Kotlin中Html.fromHtml无法解析字符串XML里的颜色标签问题

我之前也踩过一模一样的坑!其实锅不在Kotlin本身,问题出在Android API版本对Html.fromHtml方法的兼容性变更上,跟语言本身没啥关系~

问题根源

在Android 7.0(API 24)之前,Html.fromHtml(String)这个方法默认会解析包括<font>在内的大部分HTML标签,你的Java代码能正常运行,大概率是因为测试设备系统版本较低,或者项目的最低兼容版本(minSdkVersion)低于24。

但从API 24开始,这个不带flags参数的Html.fromHtml(String)被标记为废弃了,官方推出了带flags参数的重载方法Html.fromHtml(String, int)。如果在Kotlin里直接调用旧的无参重载,在高版本系统上会默认使用更严格的解析规则,<font>这类标签直接被忽略,所以第二个参数的颜色就不生效了。

解决方案

1. 直接使用带flags的重载(适配API 24+)

指定Html.FROM_HTML_MODE_LEGACY来保持和旧版本一致的解析行为,这样就能正常识别<font>标签了:

Html.fromHtml(
    String.format(getString(R.string.price_value), price, "${discount}%"),
    Html.FROM_HTML_MODE_LEGACY
)

2. 兼容低版本API(适配API 23及以下)

如果你的项目需要兼容更早的系统版本,可以加个版本判断:

val formattedContent = String.format(getString(R.string.price_value), price, "${discount}%")
val spannedText = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    Html.fromHtml(formattedContent, Html.FROM_HTML_MODE_LEGACY)
} else {
    @Suppress("DEPRECATION") // 抑制旧API的废弃警告
    Html.fromHtml(formattedContent)
}

补充说明

其实你的Java代码如果放到API 24+的设备上测试,同样会出现颜色不生效的问题,只是你可能没在高版本设备上验证过。Kotlin并没有修改String.format或者Html.fromHtml的底层逻辑,完全是系统API的行为变化导致的这个差异~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:56:01