当片段不可见时,如何防止LiveData观察器被激活

时间:2019-04-24 03:18:32

标签: android android-fragments android-lifecycle android-livedata fragment-lifecycle

我想在LiveData中使用Fragment来观察某些数据的变化。现在假设:

  1. Fragment AFragment BActivity中都有自己的容器布局,这意味着我们将分别为它们及其FragmentTransaction#add()或{由于没有onPause()操作,因此添加(UI更改)期间不会调用{1}}。
  2. B的容器大于A的容器,这意味着如果添加B,则用户将看不到A。
  3. 在A中有一个名为O的onResume()观察者,它将观察某些数据的变化,并根据该数据更新UI。关键是:我们要为更改播放一些动画,而不仅仅是天真地调用属性设置器(例如FragmentTransaction#replace()。例如,也许动画是我们调用LiveData
  4. 之后播放的动画

添加B后,A被视为对用户不可见。但是,TextView#setText()或其通过调用RecyclerView.Adapter#notifyItemInserted()的{​​{1}}的生命周期仍然处于Fragment AView状态。结果,动画将在O观察到数据更改后播放,但用户从一开始就看不到它。

我们如何解决这个问题?任何想法或答案表示赞赏。预先感谢。

1 个答案:

答案 0 :(得分:1)

如果要添加B(占用了为A分配的空间),则最好也删除片段A。这样做会带来很多好处:

1)您解决了问题。 (也就是说,如果您使用viewLifeCycleOwner来观察您的LiveData) 2)由于Fragment A的视图将被拆除,因此可以减少应用程序的内存消耗。

这是

  

这意味着我们将分别调用FragmentTransaction#add()

也不是问题。请注意,您可以链接FragmentTransaction,例如:

supportFragmentManager.beginTransaction()
    .replace(view1.id, fragmentB)
    .remove(fragmentA)
    .commit()