Android DataBinding LiveData - 不通知在 DialogFragment 和 BottomSheetDialogFragment 中更改

标签 android kotlin android-databinding android-livedata android-viewmodel

我有一个 BottomSheetDialogFragment 的布局,如下所示:

<data>

    <variable
        name="viewModel"
        type="com.sample.MyViewModel" />
</data>

<TextView android:id="@+id/tvValue"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text='@{String.format("%.1f", viewModel.weight)}'/>

<Button android:id="@+id/cmdUpdate"
                android:layout_height="wrap_content"
                android:layout_width="match_parent"
                android:onClick="@{() -> viewModel.updateWeight()}"
                android:text="@string/update" />

这是 kotlin 代码:

  // MyViewModel
  val weight = MutableLiveData<Double>()
  fun updateWeight() {
     weight.value?.let {
        weight.value = (it + 0.1)
    }
  }

 // BottomSheetDialogFragment bind view model
 val myViewModel = ViewModelProviders.of(it, factory).get(MyViewModel::class)
 binding.viewModel = myViewModel

// code showing BottomSheet:
 val fragment = MyBottomSheetFragment()
 fragment.show(fragmentManager, "bottomsheet")

第一次打开 bottomsheet fragment ,它可以显示权重值,但是当我点击按钮更新权重时,没有任何反应。从调试器中,我可以看到调用了 updateWeight 方法,并且更改了权重值,但未更新 TextView。这也发生在其他 DialogFragment 上。
如果我使用普通的 Fragment
,相同的代码可以工作 DialogFragment & DataBinding 有问题吗?

最佳答案

你需要打电话

binding.setLifecycleOwner(this)

根据 documentation ,它允许在 LiveData 更改时更新您的 View 。

关于Android DataBinding LiveData - 不通知在 DialogFragment 和 BottomSheetDialogFragment 中更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52481213/

相关文章:

android - GooglePlayServicesUtil.getOpenSourceSoftware 方法不可用

java.lang.IndexOutOfBoundsException : Index: 1, 大小 : 0 at java. util.ArrayList.get(ArrayList.java:437)

Kotlin 类型删除 - 为什么仅泛型类型不同的函数可编译,而仅返回类型不同的函数则不可编译?

rx-java - 显式类型参数 Kotlin 和 RxJava

android - 无法生成 View 绑定(bind) java.lang.IndexOutOfBoundsException

android - android 绑定(bind)应用程序中的自定义事件属性 :onMyEvent

安卓 MVVM : cannot generate view binders

android - Flutter FFmpeg - [AVFilterGraph @ 0x88f4b300] 没有这样的过滤器 : '"scale'

java - Retrofit 需要太多时间才能得到响应

function - 在Kotlin中将异常用作默认参数