我进行了很多搜索,并在互联网上找到了很多解释,但是关于FragmentsFragmentManagerfindFragmentByTag的困惑仍然存在

假设我有三个片段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)保存的总交易记录,但是当replaceFragmentManager删除所有片段时,它不会更新。请帮助我清除我的理解。

最佳答案

有关方法findFragmentByTag的文档


查找由给定标签标识的片段,该片段在从XML扩展时或在事务中添加时提供。


supportFragmentManager
    .beginTransaction()
    .replace(R.id.container, fragment, "TAG")
    .addToBackStack("StackFrameName")
    .commit()


标记是在replaceadd方法或XML中设置的。

addToBackStack为堆栈框架命名,您可以使用该名称查找堆栈框架,但不能对其本身进行分段。

replace将给定id中的片段交换为所提供的片段
add将片段添加到视图中。

这些方法的最大区别add将其视图添加到容器中,而replace用其自己的视图替换容器中的视图。
除非将堆栈代码添加到事务中,否则不会影响堆栈。

更新:

一旦替换了片段或删除了片段,它就不再附加到片段管理器上,无法通过标签进行查找,但是如果已将其添加到后堆栈中,则可以通过弹出后堆栈将其重新附加到片段管理器中,直到它到达背部。 StackFrameName的用途是什么。

10-08 02:57