我有一个看起来像这样的导航

Frag1 -> Frag2 -> Frag3

Frag2 里面有一个带有自己导航的 NavHostFragment
InnerFrag1 -> InnerFrag2

如果我这样做
  • 导航到 Frag2
  • 导航到 InnerFrag2 中的 Frag2
  • 导航到 Frag3
  • 返回

  • 然后我会在 InnerFrag2 中看到 Frag2 ,当我正常按下时,我会从 InnerFrag2InnerFrag1 中的 Frag2 但现在它会改为 Frag1

    这是我在 Frag2 中的导航处理
    
        private val backPressedCallback = OnBackPressedCallback {
            navHostFragment.navController.navigateUp()
        }
    
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            requireActivity().addOnBackPressedCallback(backPressedCallback)
        }
    
        override fun onDestroyView() {
            activity?.removeOnBackPressedCallback(backPressedCallback)
            super.onDestroyView()
        }
    
        private val navHostFragment: NavHostFragment
            get() = childFragmentManager.findFragmentById(R.id.innerNavHostFragment) as NavHostFragment
    
    

    当返回到 Frag2 时,导航主机中的 fragment 是正确的,但是向后导航会远离 Frag2,因为内部导航主机的返回堆栈丢失了。我可以以某种方式坚持它或以其他方式修复它吗?

    编辑: 实际上当从 Frag3Frag2 时,我看到里面有 InnerFrag1,两者看起来很像,这就是为什么回到这里让我回到 Frag1
    EDIT2: 我发现了我的问题,我像这样从 Frag2 中的代码膨胀 onViewCreated 的导航
        val navHostFragment = (frag2NavHostFragment as? NavHostFragment) ?: return
        val inflater = navHostFragment.navController.navInflater
        val graph = inflater.inflate(navigationId)
        navHostFragment.navController.graph = graph
    

    在 xml 中设置它使其工作,我仍然需要以某种方式从代码中设置它,Frag2 根据其参数选择要使用的导航

    现在我的问题从 Navigation's back stack is lost 更改为 How to preserve NavHostFragment's state when settings it's graph from code

    最佳答案

    您现在可以处理 fragment 上的 onBackPress。在您的 fragment 中,只需将其添加到 onViewCreated 方法中即可。

    val navController = Navigation.findNavController(view)
            requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
                override fun handleOnBackPressed() {
                    navController.popBackStack(R.id.fragmentWhereYouWantToGo, false)
                }
            })
    

    我还会检查 app:popUpToapp:popUpToInclusivesingleTop XML 属性到 Frag2 中的 fragment

    10-07 23:24