【问题标题】:Why does my fragment is still added to the backstack?为什么我的片段仍然被添加到后台堆栈?
【发布时间】:2020-07-08 08:27:31
【问题描述】:

我正在尝试将我的应用程序的一部分迁移到单个活动,并且我有两种片段:我希望用户能够返回的片段,以及我只是“临时”屏幕的片段我不希望用户能够返回。

我以为我可以为此使用 backstack,但它不起作用。

对于我使用的第一个:

supportFragmentManager.commit {
    replace(binding.fragmentContainer.id, MyFragment(), MyFragment.TAG)
    addToBackStack(MyFragment.TAG)
}

对于第二个(“临时”屏幕),我使用:

supportFragmentManager.commit {
    replace(binding.fragmentContainer.id, MyFragment())
}

当我检查supportFragmentManager.mBackStack 时,我可以看到后台堆栈已按预期设置,但似乎无关紧要,当调用onBackPressed 时,用户可以返回到不在后台堆栈上的片段。

所以我尝试像这样覆盖onBackPressed

override fun onBackPressed() {
    if (supportFragmentManager.backStackEntryCount > 1)
        supportFragmentManager.popBackStack()
}

但它似乎也不起作用。

编辑: 需要明确的是,我的 Activity 中有一个名为 fragmentContainerFragmentContainerView 并使用我提供的第一个代码示例添加第一个片段,然后我使用第二个代码示例添加第二个片段,然后使用第一个代码添加第三个片段样本。我的 backstack 然后看起来像这样:

  • MyFirstFragment
  • MyThirdFragment

“MySecondFragment”没有按预期添加到后台堆栈中,它看起来与我想要的完全一样,但是当我执行popBackstack 时,我不会回到 MyFirstFragment 而是回到 MySecondFragment,原因不明。

【问题讨论】:

    标签: android android-fragments fragment-backstack


    【解决方案1】:

    如果您要替换 Activity 顶部的 Fragment,这显然意味着该 Activity 只有一个 Fragment。所以理想情况下,backstack 计数应该为 0。在这种情况下,您的检查逻辑不正确。而不是 if (supportFragmentManager.backStackEntryCount > 1),应该是 if (supportFragmentManager.backStackEntryCount > 0)

    希望它有效。

    【讨论】:

    • 我不认为这是问题所在。我已经编辑了我的问题,希望这样更清楚。
    • 好的,所以我阅读了编辑的部分。我认为要实现您想要的,您的方法应该类似于以下内容:替换 MyFirstFragment,添加 MySecondFragment,然后再次添加 MyThirdFragment,如果您想从第三个返回到第一个或第二个,那么您可以尝试使用索引值的 popbackstack。
    • 是的,我认为我将通过将标签存储在 List 中并使用带有正确标签的 popBackstack 来进行自己的回溯。我想知道是否有更好的方法,因为这似乎有点 hacky。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多