已设置lifecycleOwner时Fragment+ViewModel+Databinding UI不更新如何解决
问题原因
你当前ViewModel中的checkboxEnabled为普通Kotlin属性,不具备可观察能力,DataBinding仅会在UI初始化时读取一次该属性值,后续属性变更不会主动触发UI刷新,因此只有Fragment销毁重建时才会重新读取属性值更新界面。
你现有Fragment中配置的binding.lifecycleOwner = viewLifecycleOwner是正确的,使用的就是Fragment的视图生命周期所有者,不需要做调整。
解决方案(无需修改现有Fragment、XML配置)
推荐优先使用LiveData方案,可以完美适配已配置的生命周期感知能力,仅需修改ViewModel代码即可:
class CheckboxDatabindingFragmentViewModel(application: Application) : AndroidViewModel(application) { // 声明为可观察的LiveData类型,初始值为true val checkboxEnabled = MutableLiveData<Boolean>(true) fun startClicked() { // 更新LiveData值,会自动通知UI刷新 checkboxEnabled.value = false // 若在子线程调用可以使用checkboxEnabled.postValue(false) } }
修改完成后点击按钮就会自动触发Checkbox的enabled状态更新,完全符合DataBinding的使用规范,不需要在UI层手动操作控件。
其他可选实现方案
方案1:使用DataBinding自带的ObservableField
如果不需要依赖LiveData的生命周期感知能力,可以直接使用可观察字段类型:
class CheckboxDatabindingFragmentViewModel(application: Application) : AndroidViewModel(application) { val checkboxEnabled = ObservableBoolean(true) fun startClicked() { checkboxEnabled.set(false) } }
方案2:继承BaseObservable手动通知属性变更
class CheckboxDatabindingFragmentViewModel(application: Application) : AndroidViewModel(application), BaseObservable { @get:Observable var checkboxEnabled = true set(value) { field = value // 手动触发属性变更通知 notifyPropertyChanged(BR.checkboxEnabled) } fun startClicked() { checkboxEnabled = false } }
内容的提问来源于stack exchange,提问作者Daniel C Jacobs
相关产品推荐
相关产品推荐

