导航控制器(管理Backback)Jetpack Android

导航控制器(管理Backback)Jetpack Android,android,uinavigationcontroller,android-architecture-components,Android,Uinavigationcontroller,Android Architecture Components,你好。因此,我一直在使用Android的Jetpack的NavComponent 我一直认为,碎片的backbackback管理必须已经在那里实施了,事实上它已经在那里了,但我面临一个问题 以下是我的结构: 我参加了一系列活动 我在活动中有一个NavHost 我在活动中有底部导航栏 对于每个底部项目,我使用单独的片段来导航 这是导航的代码 bottomNavigationView.setOnNavigationItemSelectedListener { when (i

你好。因此,我一直在使用Android的Jetpack的NavComponent

我一直认为,碎片的backbackback管理必须已经在那里实施了,事实上它已经在那里了,但我面临一个问题

以下是我的结构:

我参加了一系列活动

我在活动中有一个NavHost

我在活动中有底部导航

对于每个底部项目,我使用单独的片段来导航

这是导航的代码

     bottomNavigationView.setOnNavigationItemSelectedListener {
        when (it.itemId) {
            R.id.navigation_home -> {
                navController.apply {
                    navigate(R.id.navigation_home)
                }
                true
            }
            R.id.navigation_dashboard -> {
                navController.apply {
                    navigate(R.id.dashboardFragment)
                }
                true
            }
            R.id.navigation_notifications -> {
                true
            }
            else -> {
                false
            }
        }
    }
别介意最后一项

因此,下一个问题是

如果我多次尝试在主页仪表板之间切换,当我按back时,堆栈肯定会开始弹出其中包含的所有项目。因此,如果我移动6次,我需要12次尝试才能真正退出应用程序

目前我找不到任何源,例如
navigate()
方法将接受某种参数来兑现我的片段,而不是每次重新创建片段并添加到backbackback

那么你建议采取什么样的方法呢

如果我想在每次按下后退按钮时手动管理后退,那么导航控制器的作用是什么?仅用于创建和向前导航

我想我在Android的官方文档中遗漏了一些来源

事先谢谢你

附言。 在调用
navigate()
之前使用
navController.popBackStack()
肯定不是正确的选择。

根据:

NavigationUI还可以处理底部导航。当用户选择菜单项时,NavController调用onNavDestinationSelected()并自动更新底部导航栏中的选定项

为此,您必须为底部导航项指定与导航图中相应目的地相同的ID,然后将底部视图绑定到控制器,如下所示:

NavHostFragment navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
NavController navController = navHostFragment.getNavController();
BottomNavigationView bottomNav = findViewById(R.id.bottom_nav);
NavigationUI.setupWithNavController(bottomNav, navController);

注意:根据我的个人经验,当图表中默认开始的startDestination当前不在后堆栈中时(在我的情况下,它是我在返回主页片段时弹出的登录页),那么应用程序的行为会像这样奇怪。因此,请确保起始目的地存在于您的后堆栈中,并且可以正常工作。

哦,谢谢!这很有帮助!要测试它并给出答案,我脑海中突然出现的另一件事是抽屉,如果可以的话,我们可以用抽屉设置导航吗?工作起来很有魅力!这正是我需要的!谢谢,这是一个公认的答案!虽然我在这里又得到了一些奇怪的东西…所以我在starter片段中有一个按钮,它重定向到另一个片段。如果我回家->那个按钮->仪表板,然后一直按下去,一切都会像一个魔咒一样工作,但如果我回家->那个按钮->仪表板->再次按那个按钮,事情就会变得一团糟(这听起来像一个循环逻辑)