导航组件库启用默认情况下支持多个后退堆栈自版本以来2.4.0 https://developer.android.com/jetpack/androidx/releases/navigation#2.4.0,这在本次活动中也得到了充分的体现blog https://medium.com/androiddevelopers/multiple-back-stacks-b714d974f134.
根据您的示例代码,底部工作表导航中的五个顶级片段现在将有自己的后堆栈,如果您想从一个顶级片段导航到另一个顶级片段(就像您的情况一样),就会出现问题(Home -> ... -> Search)
.
无法回去的理由Home
是因为你从未离开Home
的 backstack 和现在Search
位于其之上,即导航组件认为您已经位于正确的片段上。
我建议首先查看导航库的最近更改,而不是尝试快速修复,因为这是一个相当大的行为更改,并且它还可能影响应用程序导航的其他部分。
从技术上讲,底部导航的多个后退堆栈的工作方式是,每次选择不同的底部导航选项时,都会执行onNavDestinationSelected(item: MenuItem, navController: NavController) https://developer.android.com/reference/androidx/navigation/ui/NavigationUI#onNavDestinationSelected(android.view.MenuItem,androidx.navigation.NavController)会流行& 保存状态当前顶级片段中的所有片段,然后导航到另一个顶级片段恢复它的状态.
因此,为了“从一个后台切换到另一个后台”,就像您从BarcodeDetail
to Search
,您需要至少通过以下两个选项来调整当前的操作:
app:popUpTo="@id/id_of_home"
app:popUpToSaveState="true"
(where id_of_home
应该是 idHome
我假设这是一个目标为Search
).
通过这两行,您可以弹出并保存以下状态Home -> BarcodeDetail
并导航至Search
,如果您现在导航回Home
通过底部导航选项,然后您将恢复状态并且您的导航应该基本上是可能的。
但是,请注意,您可能需要其他标志,例如app:restoreState="true"
and/or app:popUpToInclusive="true"
取决于你想要实现什么。