0

我有三个片段 A、B 和 C。我navHostFragmentMainActivity. 所以应用程序使用 kotlin 扩展函数从 A -> B 开始findNavController().navigate...,然后使用相同的函数从 B 转到 C。到这里为止一切正常。

现在在片段 C 中,我正在使用片段 C 替换不同的元素

activity?.supportFragmentManager
?.beginTransaction()
?.replace(R.id.list_container, someFragment)
?.addToBackStack("some_frag_id")
?.commit()

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

我也在我的MainActivity

override fun onBackPressed() {
    val count = supportFragmentManager.backStackEntryCount
    if (count == 0) {
        super.onBackPressed()
        //additional code
    }
    else {
        supportFragmentManager.popBackStack()
    }
}

我不确定这里缺少什么。我已经阅读了很多关于 stackoverflow 的解决方案,但没有一个能让我满意。请指导。

4

1 回答 1

1

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

除了修复恢复状态的情况(在使用错误的 FragmentManager 时不起作用),这还确保了onBackPressed()向下调度 FragmentManager 层次结构的默认行为可以解决问题 - 您根本不需要任何逻辑onBackPressed()来弹出正常工作。

如果您需要拦截 Fragment C 中的后退按钮,您应该按照提供的自定义后退文档来注册-即使在这些情况下OnBackPressedDispatcher也不应该覆盖。onBackPressed()

于 2020-07-10T19:48:54.793 回答