如果您位于导航图的起始目的地,为什么android jetpack NavigationUI navigateUp方法仅打开绘图菜单

Jas*_*dge 6 navigation android android-actionbar navigation-drawer android-jetpack

当使用NavigationView带有DrawLayoutActionBar,jetpack提供了一些功能强大方便的方法来挂钩一切在一起,使这些项目更容易实现.

库中setupActionBarWithNavController提供的方法NavigationUi是一种扩展方法,用于添加汉堡包按钮以打开抽屉的活动,如果您覆盖onSupportNavigateUp:Boolean活动navigateUp(drawLayout:DrawLayout, navController:NavController)方法以调用方法,该方法会将汉堡包按钮更改为后退按钮并自动返回花哨的动画,超酷.

但是,这个方法似乎实现如下:

 public static boolean navigateUp(@Nullable DrawerLayout drawerLayout,
        @NonNull NavController navController) {
    if (drawerLayout != null && navController.getCurrentDestination().getId()
            == navController.getGraph().getStartDestination()) {
        drawerLayout.openDrawer(GravityCompat.START);
        return true;
    } else {
        return navController.navigateUp();
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您在此处看到的,此方法具有以下基本逻辑:

如果你不在navgraph的起始目的地,那么按钮是一个后退按钮,否则它是一个汉堡包按钮

这意味着只有起始目的地可以通过操作栏按钮打开绘图菜单,而所有其他目的地都有后退按钮,并且必须滑动才能打开绘图菜单.

为什么会这样?这似乎是android团队有意识的设计决定.在多个目的地有一个汉堡包按钮是不是不赞成吗?

我想有几个主要的分支,有一个汉堡包菜单和所有屏幕分支的那些有一个后退按钮.有没有办法实现多个NavGraphs并将它们连接在一起NavigationView

u_u

Ben*_*fez 1

NavigationUI我报告了在bug 109868820中使用片段内的工具栏和帮助程序时遇到的问题。

帮助我的 Google 员工明确指出(文章#7):

[...] 与材料设计团队的讨论明确表明,导航抽屉是一种全局导航模式,应该随处可用

因此,材质设计抽屉必须在每个屏幕上可用,包括当导航按钮是“向上”箭头(而不是汉堡包)时更深的屏幕。在这种情况下,抽屉只能通过滑动手势使用,因为导航按钮在应用程序堆栈中向上导航。

确实(bug 中的#4):

您仍然可以从导航图中的 android:label 获得标题集,并在涉及向上按钮时获得正确的行为(如果您使用的是 DrawerLayout 版本,这一点尤其重要)

因此,您在源代码中找到的行为确实是“正确的”行为。

因此:

  • 顶层目的地:通过滑动和汉堡按钮打开抽屉
  • 非顶级目的地:仅通过滑动打开抽屉,按钮向上导航(无汉堡包)

换句话说,汉堡包按钮只能在顶级目的地上使用。