我进行了很多搜索,并在互联网上找到了很多解释,但是关于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
将从fragments
中删除(销毁)所有现有的BackStack
并将添加新的BackStackEntryCount
,但FragmentA
表明它已记住/保存了5次交易。顶部并显示给用户。问题是,如果现在执行:
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
删除所有片段时,它不会更新。请帮助我清除我的理解。 最佳答案
有关方法findFragmentByTag
的文档
查找由给定标签标识的片段,该片段在从XML扩展时或在事务中添加时提供。
supportFragmentManager
.beginTransaction()
.replace(R.id.container, fragment, "TAG")
.addToBackStack("StackFrameName")
.commit()
标记是在
replace
或add
方法或XML中设置的。addToBackStack
为堆栈框架命名,您可以使用该名称查找堆栈框架,但不能对其本身进行分段。replace
将给定id中的片段交换为所提供的片段add
将片段添加到视图中。这些方法的最大区别
add
将其视图添加到容器中,而replace
用其自己的视图替换容器中的视图。除非将堆栈代码添加到事务中,否则不会影响堆栈。
更新:
一旦替换了片段或删除了片段,它就不再附加到片段管理器上,无法通过标签进行查找,但是如果已将其添加到后堆栈中,则可以通过弹出后堆栈将其重新附加到片段管理器中,直到它到达背部。
StackFrameName
的用途是什么。