Android Jetpack Navigation 嵌套标签页的后退导航行为异常

3
我正在尝试使用Jetpack导航组件和BottomNavigationView。我创建了两层BottomNavigationView,结构如下:
  • MainActivity(带有nav_host_fragment、navigation_graph、bottom_navigation)
    • FragmentA
    • FragmentB
    • FragmentC(带有nested_nav_host_fragment、nested_navigation_graph、nested_bottom_navigation)
      • FragmentCA
      • FragmentCB
      • FragmentCC
我可以正常前进导航,但是我无法正确地后退导航。例如,当我从A -> B -> C导航,并在C中导航到CA -> CB -> CC,然后点击返回按钮或调用navControler back时,它应该从CC -> CB -> CA -> B -> A,但它直接回到了A。
您可以在此处找到最小演示项目,希望有人能够帮忙,谢谢。
1个回答

5
默认情况下,片段(Fragments)不会弹出添加到子片段后退栈的任何内容。
要使系统返回按钮弹出您的 Fragment C 的子片段,您必须通过调用 setPrimaryNavigationFragment() 明确选择该行为。
这可以在片段附加后的任何位置执行。例如,您可以在 onActivityCreated() 中更新您的 FragmentC 来实现它:
override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    NavigationUI.setupWithNavController(nested_bottom_navigation,
            activity?.findNavController(R.id.nested_nav_host_fragment)?:return)

    // This routes the system back button to this Fragment
    requireFragmentManager().beginTransaction()
            .setPrimaryNavigationFragment(this)
            .commit()
}

实际上,这就是NavHostFragment中使用的app:defaultNavHost="true"属性背后使用的技术。


嘿,感谢您的快速回复!setPrimaryNavigationFragment()确实有帮助,现在弹出序列变成了CC->CA->A,这是BottomNavigationView的预期行为吗?因为我想要实现的是CC->CB->CA->B->A,有什么建议吗?如果setPrimaryNavigationFragmet()与app:defaultNavHost =“true”相同,为什么我在fragment_c.xml中设置它没有起作用呢? - Joshua Lin
是的,那个返回堆栈是预期的(底部导航总是通过图形的“startDestination”返回,但不会经过中间项)。您外部的NavHostFragment上的defaultNavHost使其成为活动的FragmentManager的主要内容,而您内部的NavHostFragment上的defaultNavHost使其成为片段的子片段管理器的主要内容,但这错过了NavHostFragment的片段管理器(即每个目标所在的FragmentManager),因此您需要在该中间级别上手动设置它。 - ianhanniballake
值得一提的是,这个问题指出,一旦alpha04发布,导航将自动为您调用setPrimaryNavigationFragment - ianhanniballake

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接