【问题标题】:Prevent DrawerLayout from opening the right side when closing the left side?关闭左侧时防止DrawerLayout打开右侧?
【发布时间】:2018-02-28 04:49:16
【问题描述】:

我有一个带有两个抽屉的 DrawerLayout,一个在左侧,一个在右侧。

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>

问题是有时当我向左滑动关闭左侧抽屉时,它也会打开右侧。

有什么办法可以防止这种情况发生吗?我在想也许我可以阻止对面打开,直到双方都关闭至少 X 毫秒或其他时间,但我不知道该怎么做。

【问题讨论】:

标签: android android-layout navigation-drawer drawerlayout android-drawer


【解决方案1】:

根据抽屉状态锁定和解锁抽屉以防止打开和关闭

左侧抽屉代码

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

    });

右侧抽屉代码

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

    });

锁drawerLayout还有其他的重力属性。

使用 Gravity 锁定和解锁。START

解锁

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

锁定

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

使用 Gravity 锁定和解锁。END

解锁

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

锁定

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

【讨论】:

  • 嗯,但我在左侧和右侧使用相同的 DrawerLayout?是否可以只锁定一侧?
  • 更新了问题以包含 XML。
  • 能否请您也更新一下java内容,如何设置两个抽屉?
  • 好的,太好了!你之前的回答实际上让我已经实现了类似的东西。基于drawerView.getId() 我正在选择要锁定哪个抽屉。类似private int getOppositeDrawerEdgeGravity(View drawerView){ return drawerView.getId() == R.id.leftFragment ? Gravity.RIGHT :Gravity.LEFT; } 然后public void onDrawerOpened(View drawerView) { ((DrawerLayout) drawerView.getParent()).setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, getOppositeDrawerEdgeGravity(drawerView)); }。似乎工作得很好。
猜你喜欢
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多