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

