使用 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()
。
我有三个片段 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()
。