数据绑定不读取字符串标签内的字体标签 Android

Font tag inside string tag is not read with Data Binding Android

字符串资源:

<string name="hint_dob_mandatory">Date of birth<font color='#FFFF0000'>  *</font></string>
                  <!-- Already tried with '#FFFF0000', "#FFFF0000" -->
<string name="hint_dob">Date of birth</string>

下面这段代码工作正常:

android:hint="@string/hint_dob_mandatory"

下面是正确的实际输出:(正常使用字符串 res)

此处,数据绑定问题:

 android:hint="@{ANY_TRUE_CONDITION ? @string/hint_dob_mandatory : @string/hint_dob}

下面是有问题的实际输出:(使用字符串 res 的数据绑定)

关键是看方法的签名。 如果你没有使用数据绑定,你实际上是在使用这个方法:

fun EditText.setHint(resourceId: Int)

当使用Databinding时,@string/hint_dob_mandatory会自动解析为String,事实上,你正在使用这个方法:

fun EditText.setHint(hint: CharSequence)

第一个可以很好地处理字体标签,但第二个将忽略它。基本上,Databinding 试图变得聪明,但这样做使用了错误的方法。

现在,要解决这个问题,您有 2 个选择:

1) 为提示显式设置一个ResourceId

<data>
    <variable
        name="hintResource"
        type="Integer" />
</data>

<EditText
    android:hint="@{hintResource}" />

使用这种方法,您需要在绑定上设置 hintResource

binding.hintResource = R.string.hint

这有效地确保了正在使用 setHint(res: Int) 变体

2) 导入你的 R 文件

<data>
    <import type="com.your.package.R" />
</data>

<EditText
    app:resourceHint="@{ANY_TRUE_CONDITION ? R.string.hint_dob_mandatory : R.string.hint_dob}

导入R文件,即可在dataBinding表达式中使用。使用 R.string.hint 表示您使用资源。而 @string/hint 实际上会将资源转换为字符串。

最后,两者的组合也是可能的,以及创建自定义 BindingAdapter。但最后都是一样的,只要你确保使用 @StringRes Int 而不是 String