Question

I've got two navigation drawers on my view. I'd like to lock the left drawer when the right one is open, and I'd like to lock the right drawer when the left one is open.

As it stands, when (for example) the left one is open, and you swipe from the right to close it, the right drawer begins to open before the left one is fully closed. This is not desirable behavior.

Here's what I've tried, but am getting a NullPointerException when I swipe a drawer.

// Left Drawer Config
_leftDrawerToggler = new DrawerToggler(this,
                                       _rootViewLayout,
                                       Resource.Drawable.ic_drawer_light,
                                       Resource.String.drawer_open,
                                       Resource.String.drawer_close);

_leftDrawerToggler.DrawerClosed += delegate
    {
        InvalidateOptionsMenu();
        _rootViewLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked, _rightDrawerLayout);
    };

_leftDrawerToggler.DrawerOpened += delegate
{
    _leftDrawerList.SetItemChecked(0, true);
    InvalidateOptionsMenu();
    _rootViewLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed, _rightDrawerLayout);
};

_rootViewLayout.SetDrawerShadow(Resource.Drawable.drawer_shadow_dark, (int)GravityFlags.Left);
_rootViewLayout.SetDrawerListener(_leftDrawerToggler);



// Right Drawer Config
_rightDrawerToggler = new DrawerToggler(this,
                                       _rootViewLayout,
                                       Resource.Drawable.ic_drawer_light,
                                       Resource.String.drawer_open,
                                       Resource.String.drawer_close);

_rightDrawerToggler.DrawerClosed += delegate
    {
        InvalidateOptionsMenu();
        _rootViewLayout.SetDrawerLockMode(DrawerLayout.LockModeUnlocked, _leftDrawerLayout);
    };
_rightDrawerToggler.DrawerOpened += delegate
{
    _rightDrawerList.SetItemChecked(0, true);
    InvalidateOptionsMenu();
    _rootViewLayout.SetDrawerLockMode(DrawerLayout.LockModeLockedClosed, _leftDrawerLayout);
};

_rootViewLayout.SetDrawerShadow(Resource.Drawable.right_drawer_shadow_dark, (int)GravityFlags.Right);
_rootViewLayout.SetDrawerListener(_rightDrawerToggler);
Was it helpful?

Solution

Issue is that your not Locking the right VieW. The other issue is you need to have only one Listener for the DrawerLayout. From your code i could understand your have two listener for the DrawerLayout

Your Layout XML should have a DrawerLayout with two ListView (layout_gravity for ListView should be start for one and the other end )

When the Drawer is opened check if the View Object is equal View.equal() , then lock the other ListView' and when the 'Drawer is closed unlock the other ListView.

Change you code like this

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_drawer_layout);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mLeftDrawerList = (ListView) findViewById(R.id.left_drawer);
    mRightDrawerList = (ListView) findViewById(R.id.right_drawer);

    mDrawerToggle = new ActionBarDrawerToggle(this,
            mDrawerLayout,R.drawable.ic_drawer,
            R.string.drawer_open,R.string.drawer_close)
    {
        public void onDrawerOpened(View view){
            if(view.equals(mRightDrawerList)) {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mLeftDrawerList);
            }
            else {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mRightDrawerList);
            }
            invalidateOptionsMenu();
        }

        public void onDrawerClosed(View view)
        {
            if(view.equals(mRightDrawerList)) {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, mLeftDrawerList);
            }
            else {
                mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, mRightDrawerList);
            }
            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
}

This should work. Let me know if you see any issue.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top