首页 > 解决方案 > 为什么我的片段仍然被添加到后台堆栈?

问题描述

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

我以为我可以为此使用后台堆栈,但它不起作用。

对于我使用的第一个:

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

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

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

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

所以我试图onBackPressed像这样覆盖:

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

但它似乎也不起作用。

编辑:要清楚,我在我的 Activity 中有一个FragmentContainerView命名fragmentContainer,并使用我提供的第一个代码示例添加第一个片段,然后我使用第二个代码示例添加第二个片段,然后使用第一个代码示例添加第三个片段。我的 backstack 看起来像这样:

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

标签: androidandroid-fragmentsfragment-backstack

解决方案


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

希望它有效。


推荐阅读