导航应弹出堆栈,而不是返回起始目的地

时间:2019-08-01 13:53:28

标签: android android-jetpack android-navigation android-jetpack-navigation

我的Activity的布局中有一个NavHostFragment和一个BottomNavigationViewNavHostFragment有一个main_navigation_graph,其中包含四个Fragments。它们的idsBottomNavigationView#menu匹配,因此Navigation可以在我呼叫

时自行处理所有内容
activity_main_bottom_navigation.setupWithNavController(navController)

到目前为止一切正常。 我的问题是,当选择了另一个标签(在BottomBar中)时,后退按钮将转到开始目标

我知道这是预期的行为(至少根据NavigationUI.onNavDestinationSelected文档):

  

...

     

默认情况下,后退堆栈将弹出回到导航图的起始目标位置。    带有android:menuCategory="secondary"的菜单项不会弹出堆栈。

但这不是我想要的。

我想要

  

如果用户位于选项卡的“根目录”(来自BottomNavigation),并且并且用户按了后退->关闭App(完成Activity

我该如何实现?

此gif演示了当前的实现:

Szenen 标签上,按 back 后,我要关闭Activity。而是转到startDestination(这是系统标签)。

3 个答案:

答案 0 :(得分:0)

setupWithNavController跟在Principles of Navigation之后。如果您想偏离导航原理,则需要为自己的OnNavigationItemSelectedListener编写自己的BottomNavigationView,以实现所需的功能。

答案 1 :(得分:0)

startDestination (应用程序中的系统)导航到要关闭应用程序的另一个片段(应用程序中的快照)。 只需将以下两行用于startDestination的操作添加到导航图中的另一个片段即可。

app:popUpTo="@id/homeFragment"
app:popUpToInclusive="true"

对我有用。

注意: 如果要从其他片段而不是startDestination关闭应用程序

答案 2 :(得分:0)

    override fun onNavigationItemSelected(item: MenuItem): Boolean {
    if (item.itemId != host.navController.currentDestination?.id) {
        host.navController.navigate(
            item.itemId, null,
            NavOptions.Builder().setPopUpTo(R.id.nav_graph_main, false).build()
        )
    }
    return true
}

正在使用中:

binding.bottomBar.setOnNavigationItemSelectedListener(this)