我在空闲时间实现了一个 android 应用程序(在 Kotlin 中,但这与问题无关),我尝试使用 android jetpack 和新库。我有一个带抽屉导航的 Activity 。我试着按照 sample sunflower app .它在主要 Activity 中使用以下组合来启用抽屉导航背后的逻辑:
appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
setSupportActionBar(findViewById(R.id.toolbar))
setupActionBarWithNavController(navController, appBarConfiguration)
关于此代码的注意事项:当在抽屉导航中单击时,这将自动导航到正确的 fragment 并关闭抽屉并保持选中状态等。所有这些样板代码。这很整洁,也很管用。据我了解,抽屉式导航菜单项的 ID 必须与导航图中 fragment 的 ID 相匹配,这样它们才能连接起来。
我遇到的问题:当我使用抽屉导航转到导航图起始 fragment 以外的任何 fragment 时,它将显示后退按钮而不是汉堡包项。这不是我所期望的,我希望它仍然是汉堡包项目,因为抽屉导航用于在相同级别的 View 之间导航而不是相互嵌套,对吧?如果我通过单击该 fragment 中的元素(例如列表 -> 详细信息)导航到任何 fragment 的子 fragment ,我希望有一个后退按钮,但如果我使用抽屉导航导航则不会。
现在我将该问题追溯到 AppBarConfiguration
构建器,该构建器读取采用导航图的构造函数 The NavGraph,其起始目的地应被视为唯一的顶级目的地。
我可以通过覆盖 AppBarConfiguration
以返回不同的顶级目的地而不仅仅是导航图的起始目的地来相当容易地解决这个问题。
但是我的问题是,为什么会有这种默认行为?这是一个错误吗?如果我覆盖它,我会违反谷歌的一些设计指南吗?抽屉导航中的每个元素不应该像我期望的那样处于同一水平吗?是否有针对我想做的事情的不同解决方案?
最佳答案
您不必重写 AppBarConfiguration。自 alpha7
版本以来,AppBarConfiguration 有一个构造函数,其中包含一组用于所有顶级目标的 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);
这不是默认设置,因为导航图只有一个开始 fragment ,它应该始终是应用程序的单个入口点。
使用 AppBarConfiguration 编辑默认行为不会使其行为像以前一样,每个顶级 fragment 都放在后退堆栈上,因此后退按钮将转到所有顶级 fragment 。目前尚不清楚如何将顶级 fragment 作为返回堆栈的第一个元素。
关于android - 具有多个顶级目的地的导航图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53372539/