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
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