我搜索了很多,在网上找到了很多解释,但我仍然对Fragments、FragmentManager和findFragmentByTag感到困惑。
假设我有三个片段FragmentA,FragmentB,FragmentC和A,B,C分别是它们的标记。
我按照如下顺序执行FragmentTransaction:
1-添加FragmentA {BackStackEntryCount=1,BackStack=A}
2-添加FragmentB {BackStackEntryCount=2,BackStack=B,A}
3-添加FragmentA {BackStackEntryCount=3,BackStack=A,B,A}
4-添加FragmentC {BackStackEntryCount=4,BackStack=C,A,B,A}
5-替换FragmentA {BackStackEntryCount=5,BackStack=A}
在步骤5之后,它将显示replace将从BackStack中删除(销毁)所有现有的fragments,并添加新的BackStackEntryCount,但BackStackEntryCount显示它记住/保存了5个事务。所以,我有FragmentA在顶部,并显示给用户。问题是,如果我现在执行:
supportFragmentManager.findFragmentByTag("A") // returns null But it should return FragmentA? But why it is returning null?
supportFragmentManager.fragments // shows that FragmentA in returned List我的看法是,BackStackEntryCount只记住addToBackStack("SOME_TAG" or null)保存的全部事务,但是当replace从FragmentManager中删除所有片段时,它不会更新它。请帮我澄清我的理解。
发布于 2019-09-20 21:20:31
关于方法findFragmentByTag的文档
在从XML中充气时或在事务中添加时找到由给定标记标识的片段。
supportFragmentManager
.beginTransaction()
.replace(R.id.container, fragment, "TAG")
.addToBackStack("StackFrameName")
.commit()标记是在replace或add方法或XML中设置的。
addToBackStack为堆栈帧取了一个名称,您可以使用它来查找堆栈帧,而不是片段本身。
replace将给定id中的片段交换为add添加的片段到视图中的片段。
这些方法的最大区别是,add将视图添加到容器中,而replace则用自己的视图替换容器中的视图。除非将后台代码添加到事务中,否则不影响后台堆栈。
更新:
一旦您替换了一个片段或删除了一个片段,它就不再被附加到片段管理器上,无法通过标记找到它,但是如果它已经添加到后端堆栈中,您可以通过弹出后端堆栈将它重新附加到片段管理器上,直到它回来为止。这就是StackFrameName的作用所在。
https://stackoverflow.com/questions/58014282
复制相似问题