使用LiveData设置TextView的可见性

use*_*186 6 android mvvm android-databinding

我想使用LiveData切换TextView的可见性。还有其他几篇关于设置数据绑定的可见性的文章,但是这些文章使用Observables,而我想利用(较新的)LiveData。特别是,请使用LiveData。

使用该文档和一些SO帖子,我已经了解到您应该正确对齐可观察对象(LiveData)的吸气剂,以使返回类型与要设置的View属性的setter期望的类型匹配。特别:

  • View的setVisibility()需要一个int,而我有一个LiveData成员(因此ViewModel中的getter也将返回此类型)
  • 可以使用三元运算符将此布尔值转换为View.VISIBLE和VIEW.GONE。我还应该在XML表达式中添加safeUnbox()使其成为原始布尔值

利用这些见解,我在ViewModel类中定义了:

MutableLiveData<Boolean> textHintVisible;
Run Code Online (Sandbox Code Playgroud)

按下按钮后,将此值设置为False:

textHintVisible.postValue(false);
Run Code Online (Sandbox Code Playgroud)

(请注意,我也尝试过使用setValue())

然后,在我的布局XML中,我包括了:

<TextView
   android:visibility="@{(safeUnbox(viewModel.textHintVisible) ? View.VISIBLE : View.GONE)}"
/>
Run Code Online (Sandbox Code Playgroud)

但是,我的TextView始终可见。为了调试,我在活动中添加了一个观察者,这确认我的布尔值正确地在true和false之间切换:

mHintsViewModel.getTextHintVisible().observe(this, new Observer<Boolean>() {
   @Override
   public void onChanged(@Nullable Boolean newInt) {
        Log.i(TAG,"onChanged: "+newInt);
   }
});
Run Code Online (Sandbox Code Playgroud)

但是我的TextView始终保持可见。我究竟做错了什么?为此不可能使用LiveData吗?我应该使用其他转换器吗?还是我的代码原则上是正确的,但这是Android Studio中的错误吗?任何帮助深表感谢。

mly*_*yko 10

我要记住的一件事是-您是否设置了绑定以观察liveData?根据文档,您必须设置绑定布局以观察生命周期binding.setLifecycleOwner(this)

  • 对于片段使用`binding.setLifecycleOwner(viewLifecycleOwner)` (5认同)
  • 您不使用活动,在 Fragment 中实际上有 2 个 LifecycleOvwners - 1) 片段本身,2) 片段的视图。由于Fragment的实例在方向改变后不会被销毁,只有它的视图被销毁,因此需要设置绑定的生命周期到视图的生命周期,否则可能会发生内存泄漏。 (2认同)