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

Navigation Controller (Managing Backstack) Jetpack Android

美好的一天。所以我一直在使用 NavComponent of Jetpack for Android

我认为 BackStack 片段的管理必须已经在那里实施,事实上它在那里,但我遇到了一个问题。

这是我的结构:

我有条目Activity

我在 activity

中有一个 NavHost

我在 Activity

中有 底部导航栏

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

这是导航代码。

     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
            }
        }
    }

不要管最后一项。

接下来就是问题了

如果我多次尝试在 homedashboard 之间切换,当我按回键时,堆栈肯定会开始弹出所有项目包括在那里。因此,如果我移动 6 次,我将尝试 12 次才能真正退出应用程序。

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

那么您建议采用哪种方法?

如果我在按下每个后退按钮时手动管理 BackStack,那么 NavController 的目的到底是什么?仅用于创建和 FORWARD 导航?

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

先谢谢你。

P.S。 在调用 navigate() 之前使用 navController.popBackStack() 当然不是正确的选择。

根据 documentation here :

NavigationUI can also handle bottom navigation. When a user selects a menu item, the NavController calls onNavDestinationSelected() and automatically updates the selected item in the bottom navigation bar.

为此,您必须为底部导航项提供与导航图中相应目的地相同的 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 默认启动时,当前不在返回堆栈中(在我的例子中,它是我的着陆页去主页片段时弹出它)然后应用程序会像这样出现奇怪的行为。所以请确保起始目的地存在于您的返回堆栈中应该可以正常工作。