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

Android Data Binding引用字符串资源时内嵌Font标签未被识别

核心原因

两种字符串引用方式走的资源加载逻辑完全不同:

  • 布局静态编写android:hint="@string/xxx"时,系统原生资源加载逻辑会调用Context.getText(int resId),完整保留字符串内定义的富文本样式(包括<font>标签设置的颜色、格式)
  • Data Binding表达式中使用@string/xxx时,默认走的是Context.getString(int resId)的取数逻辑,这个方法会主动剥离所有富文本标签,仅返回无格式的纯文本,自然会丢失星号的红色样式。

实用修复方案

  • 全局适配改法(改动最小)
    新增一个针对android:hint属性的BindingAdapter,替换Data Binding默认的取数逻辑:

    @BindingAdapter("android:hint")
    fun TextView.setFormattedHint(hintRes: Int) {
        // 无效资源id做兜底处理,避免崩溃
        if (hintRes == 0) {
            hint = ""
            return
        }
        // 用getText替代默认的getString,完整保留资源内的富文本样式
        hint = context.getText(hintRes)
    }
    

    新增适配器后,原来的三元绑定代码完全不需要修改,重新编译运行即可正常渲染带红色星号的提示文本。

  • 局部适配改法(不改动全局默认逻辑)
    写一个通用的资源取数工具类,封装带样式的资源获取逻辑:

    public class ResHelper {
        public static CharSequence getStyledStr(android.content.Context context, int resId) {
            return context.getText(resId);
        }
    }
    

    把原来的绑定代码调整为通过工具类取数即可:

    android:hint="@{ResHelper.getStyledStr(context, ANY_TRUE_CONDITION ? @string/hint_dob_mandatory : @string/hint_dob)}"
    
  • 临时兼容写法
    移除字符串资源里的<font>标签,在代码逻辑里手动拼接带颜色的SpannableString作为hint赋值,效果和原资源内嵌标签完全一致,只是需要手动维护星号的颜色值。

小提示:没必要为了这个场景硬套Html.fromHtml()的解析逻辑,高版本Android上这种写法的兼容性反而不如直接通过资源getText()拿到的原生Spanned样式稳定。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 01:24:05