首页 > 解决方案 > 具有多个顶级目的地的导航图

问题描述

我在空闲时间实现了一个 android 应用程序(在 Kotlin 中,但这与问题无关),我尝试使用 android jetpack 和新库。我有一个带有导航抽屉的活动。我尝试遵循示例向日葵应用程序。它在主要活动中使用以下组合来启用导航抽屉背后的逻辑:

appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
setSupportActionBar(findViewById(R.id.toolbar))
setupActionBarWithNavController(navController, appBarConfiguration)

关于此代码的注意事项:当在导航抽屉中单击并关闭抽屉并保持它们被选中时,这将自动导航到正确的片段等所有样板代码。这很整洁,也很有效。据我了解,导航抽屉菜单项的 ID 必须与导航图中片段的 ID 匹配,这样它们就可以连接起来。

我遇到的问题:当我使用导航抽屉转到导航图的起始片段以外的任何片段时,它将显示一个后退按钮而不是汉堡包项目。这不是我所期望的,我希望它仍然是汉堡包,因为导航抽屉用于在同等级别的视图之间导航而不是相互嵌套,对吧?如果我通过单击该片段中的元素(例如列表-> 详细信息)导航到任何片段的子片段,我希望有一个后退按钮,但如果我使用导航抽屉导航则不会。

现在我将该问题追溯到构建器,该AppBarConfiguration构建器在构造函数上读取导航图The NavGraph whose start destination should be considered the only top level destination.,我可以通过覆盖AppBarConfiguration返回不同的顶级目的地而不仅仅是导航图的起始目的地来相当容易地解决这个问题。

但是我的问题是,为什么这种行为默认?它是一个错误吗?如果我覆盖它,我会违反谷歌的一些设计指南吗?导航抽屉中的每个元素不应该与我期望的一样吗?我想要做的有不同的解决方案吗?

标签: androidnavigation-drawerandroid-navigationandroid-jetpack

解决方案


您不必重写 AppBarConfiguration。由于版本alpha7AppBarConfiguration 有一个构造函数,其中包含所有顶级目的地的一组 id。

Set<Integer> topLevelDestinations = new HashSet<>();
topLevelDestinations.add(R.id.fragment1);
topLevelDestinations.add(R.id.fragment2);
appBarConfiguration = new AppBarConfiguration.Builder(topLevelDestinations)
                                             .setDrawerLayout(drawerLayout)
                                             .build();
NavigationUI.setupActionBarWithNavController(this, 
                                             this.navController,
                                             this.appBarConfiguration);

这不是默认的,因为导航图只有一个起始片段,它应该始终是应用程序的单一入口点。

使用 AppBarConfiguration 编辑默认行为不会使其行为像以前一样,每个顶级片段都放置在后退堆栈上,因此后退按钮将转到所有顶级片段。目前尚不清楚如何将顶级片段作为后堆栈的第一个元素。


推荐阅读