Hide ActionBar MenuItems when Navigation Drawer slides for any amount

Synergy807 picture Synergy807 · Aug 8, 2013 · Viewed 29.8k times · Source

I'm trying to implement a Navigation Drawer that hides the menu items in the ActionBar whenever the drawer is opened.

I am following google's documentation, however their code does not produce the expected behavior.

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

Using this code, the menu items are hidden when the drawer becomes completely opened , and shown when the drawer becomes completely closed.

However, the Gmail app behaves differently. The menu items are hidden as soon as the drawer opens by any amount. This is the behavior I want. Does anyone know how to achieve this?

Thanks!

Answer

Nikola Despotoski picture Nikola Despotoski · Aug 8, 2013

Have you tried this:

  1. Use invalidateOptionsMenu() whenever you toggle the nav drawer, by measuring the sliding offset.
  2. Iterate over each menu item in onPrepareOptionsMenu(Menu menu) and hide it.

    @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);
    
        }
    }
    

Detecting how much the nav drawer has slided:

     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

        }});

Note: shouldGoInvisible is class field.