导航嵌套时,导航的后退堆栈会丢失

sas*_*568 5 android android-fragments kotlin android-architecture-navigation

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

Frag1 -> Frag2 -> Frag3
Run Code Online (Sandbox Code Playgroud)

里面Frag2有一个NavHostFragment有自己的导航

InnerFrag1 -> InnerFrag2
Run Code Online (Sandbox Code Playgroud)

如果我这样做

  1. 导航Frag2
  2. 导航至InnerFrag2内部Frag2
  3. 导航Frag3
  4. 回去

然后我会看到InnerFrag2里面Frag2,当我正常按回时,我会从里面进入InnerFrag2InnerFrag1Frag2现在它会变成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

Run Code Online (Sandbox Code Playgroud)

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

编辑:实际上,当从 到Frag3时,Frag2我看到InnerFrag1里面,两者看起来很相似,这就是为什么此时返回会让我回到Frag1

编辑2:我发现了我的问题,我从这样的Frag2代码中膨胀了导航onViewCreated

    val navHostFragment = (frag2NavHostFragment as? NavHostFragment) ?: return
    val inflater = navHostFragment.navController.navInflater
    val graph = inflater.inflate(navigationId)
    navHostFragment.navController.graph = graph
Run Code Online (Sandbox Code Playgroud)

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

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

sas*_*568 1

经过一番研究后,原来的问题没有多大意义,我将其删除,但它得到了 2 票 \xc2\xaf\\_(\xe3\x83\x84)_/\xc2\xaf

\n\n

我通过在膨胀图表之前添加一项检查解决了我的问题,因此NavHostFragment只有在图表还没有的情况下才会设置该图表。

\n\n
    try {\n        navHostFragment.navController.graph\n    } catch (e: IllegalStateException) {\n        val inflater = navHostFragment.navController.navInflater\n        val graph = inflater.inflate(navigationId)\n        navHostFragment.navController.graph = graph\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

NavController.getGraph不返回 null,而是抛出IllegalStateException,因此奇怪的检查

\n