Reputation: 47377
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);
Upvotes: 2
Views: 2451
Reputation: 17085
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.
Upvotes: 1