使用LiveData设置TextView的可见性

时间:2018-09-07 19:13:55

标签: android mvvm android-databinding

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

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

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

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

MutableLiveData<Boolean> textHintVisible;

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

textHintVisible.postValue(false);

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

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

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

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

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

但是我的TextView一直保持可见状态。我究竟做错了什么?为此不可能使用LiveData吗?我应该使用其他转换器吗?还是我的代码原则上是正确的,但这是Android Studio中的错误吗?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:8)

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