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

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

View的

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

  • 利用这些见解,我在ViewModel类中定义了:
    MutableLiveData<Boolean> textHintVisible;
    

    按下按钮后,我将此值设置为False:
    textHintVisible.postValue(false);
    

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

    然后,在我的布局XML中,包含了:
    <TextView
       android:visibility="@{(safeUnbox(viewModel.textHintVisible) ? View.VISIBLE : View.GONE)}"
    />
    

    但是,我的TextView始终可见。为了进行调试,我在 Activity 中添加了一个观察者,这证实了我的 bool 值正确地在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中的错误吗?任何帮助深表感谢。

    最佳答案

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

    10-07 19:37
    查看更多