android - 如何防止在 Fragment 不可见时激活 LiveData 观察者
问题描述
我想用LiveData
inFragment
来观察一些数据的变化。现在让我们假设:
Fragment A
和都有Fragment B
自己的容器布局Activity
,这意味着我们将FragmentTransaction#add()
分别调用它们,并且在添加(UI 更改)期间不会调用它们的onPause()
or ,因为没有任何操作。onResume()
FragmentTransaction#replace()
- B 的容器比 A 的大,这意味着如果添加 B,用户就看不到 A。
- 在A中有一个
LiveData
名为O的观察者,它会观察一些数据的变化,并据此更新UI。关键是:我们想为变化播放一些动画,而不是TextView#setText()
天真地调用属性设置器(如)。例如,也许动画是我们调用后播放的动画RecyclerView.Adapter#notifyItemInserted()
添加 B 后,A 被认为对用户不可见。但是,调用的生命周期Fragment A
或View
调用的生命周期getViewLifecycleOwner()
仍然处于开启STARTED
状态RESUMED
。因此,动画会在 O 观察到的数据变化后播放,但用户从一开始就看不到它。
我们如何解决这个问题?任何想法或答案表示赞赏。提前致谢。
解决方案
如果您要添加 B(这会占用应该分配给 A 的空间),最好也删除片段 A。您会因此获得多种好处:
1)你解决了你的问题。(如果你viewLifeCycleOwner
在观察你的使用LiveData
) 2)你减少了你的应用程序的内存消耗,因为片段 A 的视图将被拆除。
这是
这意味着我们将分别调用 FragmentTransaction#add()
也不是问题。请注意,您可以链接FragmentTransaction
s,例如:
supportFragmentManager.beginTransaction()
.replace(view1.id, fragmentB)
.remove(fragmentA)
.commit()
推荐阅读
- c++ - 在特定位置向字符串添加空格
- python - Python C 扩展优化速度 (Linux)
- sql - 将新的时间戳值插入到 kamailio 中的 acc 表
- python - python - 如何使用boto3使用python仅将更改的文件从一个S3 Bucket复制到另一个S3 Bucket?
- c# - 如何使用 puppeteer-sharp touchStart 和 touchEnd 和 touch move
- office365 - 如何保护 Office 加载项/防止其他公司安装或使用它
- quantum-computing - 密度矩阵与完整性关系的区别
- javascript - 对 SharePoint 搜索 API 的请求中的 SourceId 是什么?
- html - 字体真棒字体
- python - 正负值用不同颜色的散点图