Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

androidx版本中FragmentationMagician.getActiveList()返回的fragment list顺序错误 #1205

Open
xupeilong opened this issue Oct 11, 2019 · 2 comments

Comments

@xupeilong
Copy link

FragmentationMagician.getActiveList()返回的list应当是fragment入栈顺序,很多feature依赖这个顺序。
其来源是FragmentManagerImpl.mActive,然而它在androidx中是hashmap,是无序的,并非入栈顺序。

@laohezi
Copy link

laohezi commented Nov 1, 2019

哈哈哈,我也遇到了这个问题,暴力解决方法是把方法改成了只从mAdd获取,就是不知道会有什么问题

@JantHsueh
Copy link

JantHsueh commented Feb 17, 2020

作者在support library 版本中,特意根据不同的sdk版本,来保证获取到的fragment列表是mActive。从mActive获取fragment列表也是更严谨的做法。

在androidx中,1.0.0的fragment版本,mActive 是SparseArray,官方也有List 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants