首页 > 解决方案 > 如何防止在 Fragment 不可见时激活 LiveData 观察者

问题描述

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

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

添加 B 后,A 被认为对用户不可见。但是,调用的生命周期Fragment AView调用的生命周期getViewLifecycleOwner()仍然处于开启STARTED状态RESUMED。因此,动画会在 O 观察到的数据变化后播放,但用户从一开始就看不到它。

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

标签: androidandroid-fragmentsandroid-lifecycleandroid-livedatafragment-lifecycle

解决方案


如果您要添加 B(这会占用应该分配给 A 的空间),最好也删除片段 A。您会因此获得多种好处:

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

这是

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

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

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

推荐阅读