Fragmentation
Fragmentation copied to clipboard
androidx版本中FragmentationMagician.getActiveList()返回的fragment list顺序错误
FragmentationMagician.getActiveList()返回的list应当是fragment入栈顺序,很多feature依赖这个顺序。 其来源是FragmentManagerImpl.mActive,然而它在androidx中是hashmap,是无序的,并非入栈顺序。
哈哈哈,我也遇到了这个问题,暴力解决方法是把方法改成了只从mAdd获取,就是不知道会有什么问题
作者在support library 版本中,特意根据不同的sdk版本,来保证获取到的fragment列表是mActive。从mActive获取fragment列表也是更严谨的做法。
在androidx中,1.0.0的fragment版本,mActive 是SparseArray<Fragment>,官方也有List<Fragment> getActiveFragments()函数,自己处理一下值为null的情况,顺序也是正确的。
在1.1.0 alpha02 中mActive是一个hashmap,而且它的key是随机的,也就是说转为list ,顺序是错误的
mAdd是mActive的子集,作者最后的版本1.0.3 是在mAdd中获得fragment列表,应该也没有什么问题
通俗一点讲,mActive中比mAdd多了一些,已经不需要的fragment的实例,这些实例是因为系统配置发生变化(例如:屏幕旋转)(可参考这篇文章Android - retaining fragment?),这些实例会在必要的时候显示出来,一旦显示那么mAdd中也就有了该实例。
mAdd 和 mActive 的不同之处可以看这里 difference between mAdded & mActive in source code of support.FragmentManager
以下结论是我的预测,还没有大量测试: 因为我们在代码中,对fragment所进行的操作后,预期的fragment列表和mAdd的列表是一样的,那么在对fragment列表操作的时候,也是正确的。
另外,在我维护的版本中,我解决了一些其他的问题,欢迎大家提供宝贵建议 #1237