当Fragment不可见时如何防止LiveData观察者被激活

yww*_*ynm 5 android android-lifecycle android-fragments fragment-lifecycle android-livedata

我想用LiveDatainFragment来观察一些数据的变化。现在我们假设:

  1. Fragment A都有Fragment B自己的容器布局Activity,这意味着我们将FragmentTransaction#add()单独调用它们,并且由于没有任何操作,它们的onPause()onResume()在添加(UI 更改)期间不会被调用FragmentTransaction#replace()
  2. B的容器比A的容器大,这意味着如果添加B,用户将看不到A。
  3. A中有一个LiveData名为O的观察者,它会观察一些数据的变化,并据此更新UI。关键是:我们想要为变化播放一些动画,而不是TextView#setText()天真地调用属性设置器(如)。例如,动画可能是我们调用后播放的动画RecyclerView.Adapter#notifyItemInserted()

添加B后,A就被视为对用户不可见。Fragment A然而,其生命周期或View通过调用getViewLifecycleOwner()仍然处于开启STARTED状态RESUMED。结果,O观察到数据变化后就会播放动画,但用户从一开始就看不到它。

我们该如何解决这个问题呢?任何想法或答案表示赞赏。提前致谢。

Arc*_*nes 2

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

1)你解决你的问题。(如果您正在viewLifeCycleOwner观察您的LiveData) 2)您减少了应用程序的内存消耗,因为片段 A 的视图将被拆除。

这是

这意味着我们将单独调用 FragmentTransaction#add()

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

supportFragmentManager.beginTransaction()
    .replace(view1.id, fragmentB)
    .remove(fragmentA)
    .commit()
Run Code Online (Sandbox Code Playgroud)

  • 请注意,“hide()”字面上只是设置片段上的 alpha。它对片段的生命周期没有影响。 (5认同)