我想使用LiveData来切换TextView的可见性。已经有一些其他帖子介绍了如何使用数据绑定设置可见性,但这些帖子都使用Observables,而我想利用(更新的)LiveData。特别地,使用一个LiveData。
根据这份文档和一些SO帖子,我已经学到了正确对齐可观察对象(LiveData)的getter方法,使其返回类型与要设置的视图属性的setter方法所期望的类型相匹配。具体地:
- 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的一个错误?非常感谢任何帮助。