Android String 的数据绑定 TextView 值回退到 @StringRes

Android data binding TextView value of String with fall back to @StringRes

context:与 ViewModel 的数据绑定,它以 JSON 的形式从远程源获取数据。我想在 TextView 中显示 JSON 中的文本值,但如果 JSON 中不存在数据,我想回退到 strings.xml 中定义的字符串。

android:text="@{viewModel.theText}"

我目前如何解决这个问题的是使用接受 Any 的自定义绑定适配器,并检查该值是 Int 还是 String: app:anyText="@{viewModel.theText}"。 viewModel 有类似 val theText = json.nullableString ?: R.string.placeholder.

的东西

我猜这是一个更多人处理的问题,我希望有人知道更优雅的解决方案。

您可以为您的 ViewModel 或资源提供应用程序上下文,然后执行如下操作:

val theText = json.nullableString ?: resources.getString(R.string.placeholder)

另一种选择是像您一样继续使用绑定适配器,但我会将文本输入包装在另一个对象中,如下所示:

data class TextWrapper(
   val text: String?,
   @StringRes val default: Int
)

@BindingAdapter("anyText")
   fun TextView.setAnyText(textWrapper: TextWrapper) {
   text = textWrapper.text ?: context.getString(textWrapper.default)
}

val theText = TextWrapper(text = json.nullableString, default = R.string.placeholder)

您不需要适配器来处理此使用 Null 合并运算符 operator ?? in xml.

试试下面的代码:

android:text="@{viewModel.theText?? @string/your_default_text}"

用例:

如果空合并运算符 (??) 不是 null,则选择左操作数;如果前者是 null,则选择右操作数。

P.S:在此处详细了解 DB 和表达式-> https://developer.android.com/topic/libraries/data-binding/expressions