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

