【问题标题】:Android data binding TextView value of String with fall back to @StringRes回退到 @StringRes 的 Android 数据绑定 String 的 TextView 值
【发布时间】:2021-09-09 17:33:34
【问题描述】:

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 的东西。

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

【问题讨论】:

    标签: android android-databinding android-viewmodel


    【解决方案1】:

    您可以为您的 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)
    

    【讨论】:

      【解决方案2】:

      你不需要一个适配器来处理这个使用Null coalescing operator operator ?? in xml。

      试试下面的代码:

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

      用例:

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

      P.S:在这里更了解 DB 和表达式-> https://developer.android.com/topic/libraries/data-binding/expressions

      【讨论】:

      • 谢谢,我知道这个操作符,但是后备的 stringRes 也需要来自视图模型。因此我接受了另一个答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-19
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      相关资源
      最近更新 更多