0

I have a DrawerLayout with two drawers, one on the left and one on the right side.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <fragment        
        android:id="@+id/mainFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <fragment
        android:id="@+id/leftFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"/>

    <fragment
        android:id="@+id/rightFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="right|end"/>

</android.support.v4.widget.DrawerLayout>

The problem is that sometimes when I swipe left to close the left drawer, it also opens the right one.

Is there any way to prevent this from happening? I'm thinking maybe I could block the opposite side from opening until both sides have been closed for at least X milliseconds or something, but I have no clue how to go about it.

Magnus
  • 17,157
  • 19
  • 104
  • 189

1 Answers1

1

Lock and UnLock the drawer from opening and closing based on drawer status

Code for LeftSide Drawer

mDrawerLayoutLeft.addDrawerListener(new DrawerLayout.DrawerListener() {

        @Override
        public void onDrawerOpened(View drawerView) {
            //lock the right side drawer when open the left drawer
            mDrawerLayoutRight.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        }

        @Override
        public void onDrawerClosed(View drawerView) {
             //unlock the right side drawer when close the left  drawer
            mDrawerLayoutRight.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        }

    });

Code for right side drawer

mDrawerLayoutRight.addDrawerListener(new DrawerLayout.DrawerListener() {

        @Override
        public void onDrawerOpened(View drawerView) {
            //lock the left side drawer when open the right  drawer
            mDrawerLayoutLeft.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        }

        @Override
        public void onDrawerClosed(View drawerView) {
             //unlock the left side drawer when close the right drawer
            mDrawerLayoutLeft.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        }

    });

There is other property for lock drawerLayout with gravity.

Lock and unlock with Gravity.START

UNLOCK

mDrawerLayoutLeft.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.START);

LOCK

mDrawerLayoutLeft.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.START);

Lock and unlock with Gravity.END

UNLOCK

mDrawerLayoutLeft.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.END);

LOCK

mDrawerLayoutLeft.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.END);
MJM
  • 5,119
  • 5
  • 27
  • 53
  • Hmm, but I'm using the same DrawerLayout for both the left and right side? Is it possible to lock one side only? – Magnus Feb 28 '18 at 07:55
  • Updated the question to include the XML. – Magnus Feb 28 '18 at 09:31
  • can you please also update java content,how you setup two drawer? – MJM Feb 28 '18 at 09:36
  • Ok great! Your previous answer actually made me implement something similar already. Based on `drawerView.getId()` I'm choosing which of the drawers to lock. Something like `private int getOppositeDrawerEdgeGravity(View drawerView){ return drawerView.getId() == R.id.leftFragment ? Gravity.RIGHT :Gravity.LEFT; }` and then `public void onDrawerOpened(View drawerView) { ((DrawerLayout) drawerView.getParent()).setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, getOppositeDrawerEdgeGravity(drawerView)); }`. Seems to work great. – Magnus Feb 28 '18 at 10:55