当前位置: 首页 > 知识库问答 >
问题:

当导航抽屉滑动任意数量时隐藏ActionBar菜单项

孙元明
2023-03-14

我正在尝试实现一个导航抽屉,每当抽屉打开时,它会将菜单项隐藏在ActionBar中。

我遵循谷歌的留档,但是他们的代码不产生预期的行为。

http://developer.android.com/training/implementing-navigation/nav-drawer.html

使用此代码,菜单项在抽屉完全打开时隐藏,并在抽屉完全关闭时显示。

然而,Gmail应用程序的表现有所不同。只要抽屉打开任意数量,菜单项就会隐藏。这就是我想要的行为。有人知道如何做到这一点吗?

谢谢

共有3个答案

凌征
2023-03-14

我有一半同意尼古拉的观点,但只要在抽屉状态发生变化时更新图标就足够了

创建全局变量以跟踪抽屉状态:

private int mDrawerState;

设置新的抽屉式储物箱:

mDrawerLayout.setDrawerListener(new DrawerListener() {

  @Override
  public void onDrawerStateChanged(int state) {
    mDrawerState = state;
    invalidateOptionsMenu();
  }

  @Override
  public void onDrawerSlide(View view, float slide) {
    // TODO Auto-generated method stub
  }

  @Override
  public void onDrawerOpened(View view) {
    // TODO Auto-generated method stub
  }

  @Override
  public void onDrawerClosed(View view) {
    // TODO Auto-generated method stub
  }
});

更新菜单可见性:

boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawer);
for(int i=0;i<menu.size();i++){
  // If the drawer is moving / settling or open do not draw the icons
  menu.getItem(i).setVisible(mDrawerState!=DrawerLayout.STATE_DRAGGING &&
      mDrawerState!=DrawerLayout.STATE_SETTLING && !drawerOpen);
}
袁奇文
2023-03-14

如果您想在抽屉进入屏幕后立即覆盖操作栏,并在抽屉不再可见时恢复操作栏(这正是Gmail截至2014年3月20日的表现),您可以使用以下代码:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
    R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {

  @Override
  public void onDrawerStateChanged(int newState) {
    super.onDrawerStateChanged(newState);

    boolean isOpened = mDrawerLayout.isDrawerOpen(mDrawerList);
    boolean isVisible = mDrawerLayout.isDrawerVisible(mDrawerList);

    if (!isOpened && !isVisible) {
      if (newState == DrawerLayout.STATE_IDLE) {
        // drawer just hid completely
        restoreActionBar();
      } else {
        // } else if (newState == DrawerLayout.STATE_SETTLING) {
        // drawer just entered screen
        overrideActionBar();
      }
    }
  }

  private void restoreActionBar() {
    getSupportActionBar().setTitle(mTitle);
    supportInvalidateOptionsMenu();
  }

  private void overrideActionBar() {
    getSupportActionBar().setTitle(mDrawerTitle);
    supportInvalidateOptionsMenu();
  }
};

// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);

根据需要修改restoreActionBar()和overrideActionBar()方法。

无需区分刷卡和主页按钮,也无需测量刷卡长度。

如果不想引用抽屉列表视图,请使用以下代码:

    boolean isOpened = mDrawerLayout.isDrawerOpen(GravityCompat.START);
    boolean isVisible = mDrawerLayout.isDrawerVisible(GravityCompat.START);

您可能需要使用重力compat。而是根据您在XML布局中指定的内容结束。

上面的示例没有隐藏与导航抽屉下的内容相关的操作栏项。要做到这一点或在抽屉可见时显示不同的图标集,您必须跟踪抽屉是手动打开还是关闭的。

除了上面的代码声明私有布尔mDrawerViable=false具有正确的保存/恢复状态处理。然后修改mDrawerTougle内部方法如下:

  private void restoreActionBar() {
    getSupportActionBar().setTitle(mTitle);
    mDrawerVisible = false;
    supportInvalidateOptionsMenu();
  }

  private void overrideActionBar() {
    getSupportActionBar().setTitle(mDrawerTitle);
    mDrawerVisible = true;
    supportInvalidateOptionsMenu();
  }

最后,在onCreateOptionsMenu中膨胀不同的菜单资源或在onPresareOptionsMenu中根据mDrawerViable的值显示/隐藏不同的操作。

苏雅珺
2023-03-14

你试过这个吗:

>

  • 每当您切换导航抽屉时,通过测量滑动偏移量,使用validateOptionsMenu()
  • 遍历每个菜单项在上准备选项菜单(菜单菜单)并隐藏它。

    @Override
    
    public boolean onPrepareOptionsMenu(Menu menu) {
    
        // If the nav drawer is open, hide action items related to the content view
        boolean drawerOpen = shouldGoInvisible;
        hideMenuItems(menu, !drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }
    
    private void hideMenuItems(Menu menu, boolean visible)
    {
    
        for(int i = 0; i < menu.size(); i++){
    
            menu.getItem(i).setVisible(visible);
    
        }
    }
    

    检测导航抽屉滑动的程度:

         mDrawerLayout.setDrawerListener(new DrawerListener(){
                        float mPreviousOffset = 0f;
    
            @Override
            public void onDrawerClosed(View arg0) {
                             super.onDrawerClosed(arg0);
                             shouldGoInvisible = false;
                             invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
    
            @Override
            public void onDrawerOpened(View arg0) {
                             super.onDrawerOpened(arg0);
                             shouldGoInvisible = true;
                             invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
            }
    
            @Override
            public void onDrawerSlide(View arg0, float slideOffset) {
                 super.onDrawerSlide(arg0, slideOffset);
                 if(slideOffset > mPreviousOffset && !shouldGoInvisible){
                    shouldGoInvisible = true;
                    invalidateOptionsMenu();
                }else if(mPreviousOffset > slideOffset && slideOffset < 0.5f && shouldGoInvisible){
                    shouldGoInvisible = false;
                    invalidateOptionsMenu();
                }
                mPreviousOffset = slideOffset;
    
    
            }
    
            @Override
            public void onDrawerStateChanged(int arg0) {
                // or use states of the drawer to hide/show the items
    
            }});
    

    注意:应该是类字段。

  •  类似资料:
    • 对于jfeinstein10(https://github.com/jfeinstein10/slidingmenu),我可以在应用中的任何地方滑动以滑动打开菜单。 用户可以通过从屏幕左边缘滑动或通过触摸操作栏上的应用图标将导航抽屉带到屏幕上。

    • 二等 三等

    • 有没有办法禁用滑动手势来打开导航抽屉?在标签之间滑动时出现菜单真的很烦人。

    • SlidingMenu库是一个优秀的第三方库,我已经使用它很长时间了。现在我知道Android使用导航抽屉提供了一个新的导航模式。它看起来像滑动菜单。那么有谁已经使用了这两个?有什么区别,优缺点是什么?非常感谢。

    • 我想在ActionBar的右侧[而不是默认的左侧]显示ActionBar导航图标。 此外,我需要有相同的幻灯片在动画导航抽屉图标在Gmail和谷歌加应用程序。 有没有什么方法可以轻松实现右侧的动画。 任何形式的帮助或建议都是感激的。 提前道谢!

    • 就像Android开发者的页面上说的 用户可以通过从屏幕左边缘滑动或通过触摸操作栏上的应用图标将导航抽屉带到屏幕上。 但奇怪的是,我的活动上的导航抽屉对滑动动作没有反应。它只在触摸操作栏上的图标时切换。下面是我对导航抽屉的实现 对此有什么可能的解释吗?我怀疑的是我的活动默认有它的一个片段的布局。所以这是原因吗? 编辑:我的活动的布局文件