首页 > 解决方案 > 使用数据绑定 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 的数据绑定)

使用数据绑定输出

标签: androidandroid-layoutdata-binding

解决方案


关键是看方法的签名。如果您不使用数据绑定,则实际上是在使用此方法:

fun EditText.setHint(resourceId: Int)

使用 Databinding 时,@string/hint_dob_mandatory将自动解析为 String,实际上,您正在使用此方法:

fun EditText.setHint(hint: CharSequence)

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

现在,要解决它,您有两个选择:

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。但最后都是一样的,只要你确保使用 an@StringRes Int而不是 aString


推荐阅读