使用 NavHostFragment 时从当前 Fragment 返回到替换 Fragment 的问题

Problem going back from current Fragment back to the replaced Fragment when using NavHostFragment

我有三个片段 A、B 和 C。我在 MainActivity 中使用 navHostFragment 容器。因此,应用程序使用 kotlin 扩展函数 findNavController().navigate... 从 A -> B,然后使用相同的函数从 B 转到 C。到这里为止一切正常。

现在在片段 C 中,我使用

替换片段 C 上的不同元素
activity?.supportFragmentManager
?.beginTransaction()
?.replace(R.id.list_container, someFragment)
?.addToBackStack("some_frag_id")
?.commit()

list_container 替换为 someFragment。在此之后,当我按下物理后退按钮时,片段 C 弹出,我的应用程序转到片段 B,而我希望它恢复的内容被替换 list_container 即替换之前的内容。

我也在 MainActivity

中覆盖了这一点
override fun onBackPressed() {
    val count = supportFragmentManager.backStackEntryCount
    if (count == 0) {
        super.onBackPressed()
        //additional code
    }
    else {
        supportFragmentManager.popBackStack()
    }
}

我不确定这里缺少什么。我已经阅读了很多关于 Whosebug 的解决方案,但 none 的效果令我满意。请指导。

如果要将片段添加到片段中的视图,则必须始终使用 childFragmentManager - 在这种情况下,使用 activity?.supportFragmentManager 始终是错误的 FragmentManager。

除了修复恢复状态的情况(当使用错误的 FragmentManager 时这将不起作用),这也确保了在 FragmentManager 层次结构中调度 onBackPressed() 的默认行为将解决这个问题 - 你不应该onBackPressed() 中需要任何逻辑才能使流行音乐正常工作。

如果您需要拦截 Fragment C 中的后退按钮,您应该按照 providing custom back documentation 注册一个 OnBackPressedDispatcher - 即使在这些情况下,您也不应该覆盖 onBackPressed()