Android 使用LiveData设置TextView的可见性

Android 使用LiveData设置TextView的可见性,android,mvvm,android-databinding,Android,Mvvm,Android Databinding,我想使用LiveData切换TextView的可见性。还有其他一些关于设置数据绑定的可见性的帖子,但是这些帖子使用了可观察性,而我想利用(更新的)LiveData。特别是,使用LiveData 通过使用,以及一些SO文章,我已经了解到您应该正确地对齐您的可观察(LiveData)的getter,以便返回类型与您想要设置的视图属性的setter所期望的类型相匹配。具体而言: View的setVisibility()需要一个int,而我有一个LiveData成员(因此ViewModel中的gett

我想使用LiveData切换TextView的可见性。还有其他一些关于设置数据绑定的可见性的帖子,但是这些帖子使用了可观察性,而我想利用(更新的)LiveData。特别是,使用LiveData

通过使用,以及一些SO文章,我已经了解到您应该正确地对齐您的可观察(LiveData)的getter,以便返回类型与您想要设置的视图属性的setter所期望的类型相匹配。具体而言:

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

MutableLiveData<Boolean> textHintVisible;
(注意,我还尝试了setValue())

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

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

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

mHintsViewModel.getTextHintVisible().observe(this, new Observer<Boolean>() {
   @Override
   public void onChanged(@Nullable Boolean newInt) {
        Log.i(TAG,"onChanged: "+newInt);
   }
});
mHintsViewModel.getTextHintVisible().observe(这是新的观察者(){
@凌驾
公共void onChanged(@Nullable Boolean newInt){
Log.i(标记“onChanged:+newInt”);
}
});

但我的文本视图始终可见。我做错了什么?是否无法使用LiveData进行此操作?我应该使用额外的转换器吗?或者我的代码原则上是正确的,但这是Android Studio中的错误吗?非常感谢您的帮助。

我想到的一件事是:您是否已将绑定设置为观察liveData?根据,您必须设置绑定布局以观察lifecycle
绑定。setLifecycleOwner(this)

我想到的一件事是-您是否已将绑定设置为观察liveData?根据文档,您必须设置绑定布局以观察lifecycle
binding.setLifecycleOwner(this)
这确实是个问题!谢谢!我把它作为一个答案发布,这样你可以接受它,其他人可以看到它的解决方案并找到答案,而不仅仅是在注释中:)所有与他的LiveData变量相关的代码都会很有用。您提到“因此我的ViewModel中的getter也将返回此类型”,但“使用三元运算符可以将此布尔值转换为View.VISIBLE和View.GONE。”告诉我getter可以返回布尔值,但三元值将就地转换为int,但它似乎没有按描述工作。实际上,我们只是缺少getTextHintVisible()方法。对于片段,请使用
绑定。setLifecycleOwner(viewLifecycleOwner)
@Francis为什么要使用片段的活动作为生命周期所有者?将UI附加到片段的生命周期,而不是保存它的活动,这不是重点吗?请提供文档来解释您的评论。您不使用活动,在片段中实际上有2个生命周期eOvwners-1)片段本身,2)片段的视图。由于片段的实例在方向更改后没有被销毁,只有它的视图被销毁,所以有必要将绑定的生命周期设置为视图的生命周期,否则可能会发生内存泄漏。
mHintsViewModel.getTextHintVisible().observe(this, new Observer<Boolean>() {
   @Override
   public void onChanged(@Nullable Boolean newInt) {
        Log.i(TAG,"onChanged: "+newInt);
   }
});