Android Jetpack Navigation 嵌套选项卡向后导航奇怪的行为
Android Jetpack Navigation nested tab backward navigation strange behaviour
所以我正在尝试使用 BottomNavigationView 的 Jetpack 导航组件。我创建了两层 BottomNavigationView,结构如下:
- MainActivity(与 nav_host_fragment、navigation_graph、bottom_navigation)
- 片段A
- 片段 B
- FragmentC(有nested_nav_host_fragment、nested_navigation_graph、nested_bottom_navigation)
- 片段CA
- 片段CB
- 片段CC
我向前导航没问题,但我无法正确向后导航。
例如,当我从 A -> B -> C 导航,在 C 中导航 CA -> CB -> CC,然后单击后退按钮或调用 navControler 返回时,它应该从 CC -> CB -> CA -> B -> A,但它直接去了A。
可以找到最小的demo工程here,希望有人能帮忙,谢谢。
默认情况下,片段不会弹出任何添加到子片段后栈的内容。
要让系统后退按钮弹出 Fragment C 的子 Fragment,您必须通过调用 setPrimaryNavigationFragment().
特别选择该行为
附加片段后,可以在片段中的任何位置完成此操作。例如,您可以更新 FragmentC 以在 onActivityCreated()
:
中执行此操作
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"
属性在幕后使用的技术相同。
所以我正在尝试使用 BottomNavigationView 的 Jetpack 导航组件。我创建了两层 BottomNavigationView,结构如下:
- MainActivity(与 nav_host_fragment、navigation_graph、bottom_navigation)
- 片段A
- 片段 B
- FragmentC(有nested_nav_host_fragment、nested_navigation_graph、nested_bottom_navigation)
- 片段CA
- 片段CB
- 片段CC
我向前导航没问题,但我无法正确向后导航。 例如,当我从 A -> B -> C 导航,在 C 中导航 CA -> CB -> CC,然后单击后退按钮或调用 navControler 返回时,它应该从 CC -> CB -> CA -> B -> A,但它直接去了A。
可以找到最小的demo工程here,希望有人能帮忙,谢谢。
默认情况下,片段不会弹出任何添加到子片段后栈的内容。
要让系统后退按钮弹出 Fragment C 的子 Fragment,您必须通过调用 setPrimaryNavigationFragment().
特别选择该行为附加片段后,可以在片段中的任何位置完成此操作。例如,您可以更新 FragmentC 以在 onActivityCreated()
:
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"
属性在幕后使用的技术相同。