看起来,混合使用fragmentManager控制返回堆栈和导航架构控制返回堆栈也可能导致这个问题。
例如,原始的CameraX基本示例使用了以下fragmentManager返回堆栈导航,似乎它没有正确地与导航交互:
view.findViewById<ImageButton>(R.id.back_button).setOnClickListener {
fragmentManager?.popBackStack()
}
如果您在从主碎片(本例中为相机碎片)移动之前记录“当前目标”,然后在返回主碎片时再次记录它,您可以从日志的id中看到id不同。预测是,导航在移动到碎片时更新了它,而fragmntManager在返回时没有再次更新它。从日志记录:
之前:D/CameraXBasic: currentDest?:androidx.navigation.fragment.FragmentNavigator$Destination@b713195
之后:D/CameraXBasic: currentDest?:androidx.navigation.fragment.FragmentNavigator$Destination@9807d8f
CameraX基本示例的更新版本使用Navigation进行返回。
view.findViewById<ImageButton>(R.id.back_button).setOnClickListener {
Navigation.findNavController(requireActivity(), R.id.fragment_container).navigateUp()
}
这个功能正常工作,日志显示在返回到主要片段时id相同。
Before: D/CameraXBasic: currentDest?: androidx.navigation.fragment.FragmentNavigator$Destination@b713195
After: D/CameraXBasic: 当前目标:androidx.navigation.fragment.FragmentNavigator$Destination@b713195
我怀疑故事的寓意,至少目前来看,就是要非常小心地将导航与fragmentManager导航混合使用。