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

Posted

技术标签:

【中文标题】如果您位于导航图的起始目的地,为啥android jetpack NavigationUI navigateUp 方法仅打开绘图菜单【英文标题】:Why does the android jetpack NavigationUI navigateUp method only open the draw menu if you are at the start destination of the nav graph如果您位于导航图的起始目的地,为什么android jetpack NavigationUI navigateUp 方法仅打开绘图菜单 【发布时间】:2018-10-29 01:18:35 【问题描述】:

NavigationViewDrawLayoutActionBar 一起使用时,jetpack 提供了一些强大的便捷方法来将所有内容连接在一起,以便更容易实现这些项目。

NavigationUi 库中提供的方法 setupActionBarWithNavController 是 Activity 的扩展方法,它添加了一个汉堡按钮来打开抽屉,如果您在 Activity 上重写 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();
    

正如你在这里看到的,这个方法的基本逻辑是:

如果您不在导航图的起始目的地,则该按钮为后退按钮,否则为汉堡按钮

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

为什么会这样?这似乎是 android 团队有意识的设计决定。在多个目的地提供汉堡包按钮是否令人不悦?

我希望有几个主要的分支有一个汉堡菜单和所有从这些分支分支的屏幕都有一个后退按钮。有没有办法实现多个NavGraphs 并将它们链接到一个NavigationView 中?

u_u

【问题讨论】:

我也想知道这个。没有任何 Google 应用以这种方式工作,那么为什么它们会改变预期的行为? 您的问题解决了吗?我查看了NavigationUI 类的源代码,并使用该代码实现了多个***目的地。如果您有兴趣,我可以发布代码作为答案。 【参考方案1】:

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

帮助我的 Google 员工明确指出(第 7 条):

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

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

确实(错误中的#4):

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

所以您在源代码中找到的行为确实是“正确的”行为。

因此:

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

换句话说,汉堡包按钮只能用于***目的地。

【讨论】:

不幸的是,我认为许多用户会忘记这样一个事实,即您可以在没有任何迹象的情况下将抽屉菜单滑出。我们是否打算在左侧有一个选项卡来指示抽屉菜单是可访问的?也许还有其他方法可以通知用户抽屉菜单在那里? 用户来到您的***目的地,他们通过汉堡包图标发现抽屉。然后,他们知道您的应用有一个抽屉,并通过滑动打开它。 不幸的是,当前只能有一个***目的地(开始目的地),因此汉堡按钮仅在一个片段中可见,而不是在所有***目的地中可见。除非我遗漏了什么并且错误地在导航控制器上设置了抽屉。 所有***是什么意思?只可以有一个人!!! (双关语)我的理解是launcher = top level(汉堡),所有其他屏幕都是二级(没有汉堡) @BenoitDuffez Google 应用程序有许多***目的地。例如查看 Gmail 应用程序。***目的地有:收件箱、已发送、草稿……仅举几例。在操作栏中都有汉堡包图标。一般来说,***目的地是从抽屉(汉堡菜单)到达的。他们的子目的地是二级(没有汉堡)。

以上是关于如果您位于导航图的起始目的地,为啥android jetpack NavigationUI navigateUp 方法仅打开绘图菜单的主要内容,如果未能解决你的问题,请参考以下文章

Android 目的地片段未出现在导航中

Android导航组件后退按钮不起作用

创建Google地球,例如球体导航

检测Android导航栏方向

为啥我的按钮位于导航栏中的“工作流程”下方?

如何保存底部导航片段的状态 - 具有单个导航图的 Android 导航组件