【问题标题】:Android LiveData and DataBinding - problem with numbersAndroid LiveData 和 DataBinding - 数字问题
【发布时间】:2021-03-01 13:01:49
【问题描述】:

我正在使用带有 DataBindg 的 LiveData。 我的视图模型:

private val _counter = MutableLiveData<Int>()
val counter: LiveData<Int>
    get() = _counter

在初始化块中它被设置为 0。

init {
    _counter.value = 0

活动中:

binding.viewModel = viewModel
binding.lifecycleOwner = this

视图中的数据绑定:

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

运行应用程序后因错误而关闭,因为它尝试获取计数器 0 的值并将其放入 getString 方法,当参数为 Int 时尝试查找字符串资源。 错误:

java.lang.RuntimeException: Failed to call observer method
...
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x0

它尝试在 ClickMeBindingImpl.java 中运行生成的代码

if ((dirtyFlags & 0x31L) != 0) {
    // api target 1
    this.clickCounterText.setText(androidxDatabindingViewDataBindingSafeUnboxViewModelCounterGetValue);
        }

你知道为什么吗?

我的解决方案是: android:text="@{viewModel.counter+}" 或更好的解决方案:

<string name="number">%d</string>
...
android:text="@{@string/number(viewModel.counter)}"

你知道我是否做错了,或者为什么它不知道计数器是 Int 并且我想将 Int 的值放入视图中? 谢谢

【问题讨论】:

    标签: android data-binding android-databinding android-livedata


    【解决方案1】:

    您在layout xml 文件 中的viewmodel.counter 指的是ViewModel 的计数器 变量,它的类型是Int.

    android:text 属性需要 String 类型的值。

    要解决这个问题,您必须使用android:text="@{String.valueOf(viewmodel.counter)}",它实际上返回一个Int 的字符串表示

    在您的布局 xml 文件中只需替换

    android:text="@{viewModel.counter}"android:text="@{String.valueOf(viewmodel.counter)}"

    【讨论】:

      猜你喜欢
      • 2020-03-27
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多