【问题标题】:BackStackEntryCount and FragmentManagerBackStackEntryCount 和 FragmentManager
【发布时间】:2021-01-03 16:02:58
【问题描述】:

我已经搜索了很多,并在互联网上找到了很多解释,但我仍然对FragmentsFragmentManagerfindFragmentByTag 感到困惑

假设我有三个片段FragmentA,FragmentB,FragmentCA,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 显示它记住/保存了 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) 保存的总交易,但当replaceFragmentManager 删除所有片段时它不会更新它。请帮我澄清一下我的理解。

【问题讨论】:

  • 请发布您的代码。
  • 代码?我说的是理解。我的代码没有任何错误

标签: java android android-fragments kotlin


【解决方案1】:

方法findFragmentByTag的文档

查找由给定标记标识的片段,无论是从 XML 膨胀时还是在添加到事务中时提供的标记。

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

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

addToBackStack 为堆栈帧取一个名称,您可以使用它来查找堆栈帧,但不能查找片段本身。

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

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

更新:

一旦您替换了一个片段或删除了一个片段,它就不再附加到片段管理器以便能够通过标签找到,但是如果它已被添加到后台堆栈,您可以通过弹出后台堆栈将其重新附加到片段管理器直到它回来。这就是StackFrameName 的用途。

【讨论】:

  • 正如您在我的步骤 1、2、3、4、5 中看到的那样。我将它们添加到 backStack。
  • 是的,但findFragmentByTag 不查看后台名称,而是查看addad 和replace 标签。您使用 popBackStack(String name, int flags) 的 backstack 名称,但不用于查找特定片段。
  • 片段属于迄今为止最糟糕的设计。我从来没有见过比片段这么多的问题和错误。
猜你喜欢
  • 2019-02-14
  • 1970-01-01
  • 2014-06-24
  • 2021-04-09
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 2013-07-12
相关资源
最近更新 更多