【问题标题】:Navigation Drawer - hamburger menu working but back arrow opens the drawer导航抽屉 - 汉堡菜单工作但后退箭头打开抽屉
【发布时间】:2020-08-22 22:15:18
【问题描述】:

我正在使用导航抽屉,汉堡菜单显示在所有右侧屏幕中,但在其他片段上,当我单击后退箭头时,当我想返回堆栈时导航抽屉打开上一屏。

如何更改行为,以便在显示箭头时,与汉堡菜单相反,我可以捕获用户点击箭头?

我正在使用带有片段的导航抽屉。在主要活动中,我使用 AppBarConfiguration 设置顶级目的地:

AppBarConfiguration config = new AppBarConfiguration.Builder(topLevelDestinations)
                .setDrawerLayout(drawerLayout)
                .build();

    NavigationUI.setupActionBarWithNavController(this, navController, config);
    NavigationUI.setupWithNavController(navView, navController);
    
    navView.setNavigationItemSelectedListener(this);

我正在捕获来自顶级目的地的所有选择并进行适当的导航:

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    item.setChecked(true);

    drawerLayout.closeDrawers();

    int id = item.getItemId();

    switch (id) {
      ...
    }
    drawerLayout.closeDrawer(GravityCompat.START);
    return true;
}

【问题讨论】:

  • 部分。我可以使用 getFragmentManager().popBackStack(),但需要捕获事件。
  • 获取事件是什么意思?这不是你问题的一部分,对吧?
  • 从哪里调用 getFragmentManager().popBackStack()?片段? onNavigationItemSelected 在 Activity 中,很棒。非 TopLevelDestinations 的结构是否不同?

标签: android android-navigation


【解决方案1】:

getFragmentManager().popBackStack() 方法可能就是您正在寻找的。这是一个用于活动的示例 sn-p:

@Override
public void onBackPressed(){
    FragmentManager fm = getFragmentManager();
    if (fm.getBackStackEntryCount() > 0) {
        Log.i("MainActivity", "popping backstack");
        fm.popBackStack();
    } else {
        Log.i("MainActivity", "nothing on backstack, calling super");
        super.onBackPressed();  
    }
}

如果是片段,请尝试像这样调用片段:

getSupportFragmentManager().beginTransaction()
    .add(detailFragment, "detail") // Add this transaction to the back stack
    .addToBackStack(null)
    .commit();

【讨论】:

  • 我的活动中有 onBackPressed(),并放入日志语句以查看它何时被调用。当箭头显示并且我单击箭头时,我没有看到它在片段上被调用。抽屉仍然打开。
  • 一个活动可以容纳多个片段。片段中发生的事情由片段中的代码定义。如果您再次调用相同的活动,则会调用活动代码。因此,在您的情况下,您在 onBackPressed() 中提供的记录器将不会显示,因为您试图调用您在片段内的活动中编写的代码。 @icj
  • 我在想像 onNavigationItemSelected 这样的东西在活动中并且无论片段如何都会被调用。我不知道只有在显示未指定为 topLevelDestination 的片段时才会出现的“后退箭头”是否是这样的。因此,我可以在活动中拥有一个覆盖函数,该函数将响应用户单击箭头而不管片段如何。如果有,功能是什么?否则,我希望需要在每个片段中覆盖或创建一个函数。如果是这样,它的功能是什么?是我们需要添加的东西吗?
  • 显示汉堡菜单或向上箭头时的行为应该不同。我可以为我的顶级目的地片段显示汉堡菜单,并为其他片段显示向上箭头,但无论显示什么,导航抽屉都会打开。它应该显示为汉堡包,但对于向上箭头,它应该回到堆栈中。显示向上箭头时如何覆盖抽屉开口?
猜你喜欢
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 2015-07-28
相关资源
最近更新 更多