小编典典

为什么我不能用布局重力锁定 DrawerLayout

Android

我使用DrawerLayout,最近我想改变drawerLayout中listView的重力。但是在我将 listView 的重力更改为android:layout_gravity="start|bottom"from 后android:layout_gravity="start",drawerLayout 无法锁定到

mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

setDrawerLockMode() 使用;

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</RelativeLayout>

<ListView
    android:id="@+id/drawer_list"
    android:layout_width="320dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="#F3F3F4"
    android:choiceMode="singleChoice" >
</ListView>

但它不会锁定;

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
</RelativeLayout>

<ListView
    android:id="@+id/drawer_list"
    android:layout_width="320dp"
    android:layout_height="match_parent"
    android:layout_gravity="start|bottom"
    android:background="#F3F3F4"
    android:choiceMode="singleChoice" >
</ListView>

`

为什么我不能将锁定模式与其他重力一起使用的任何线索?

谢谢!


阅读 206

收藏
2022-06-22

共1个答案

小编典典

根据文档,可以使用的唯一Gravity.LEFT可用重力是,Gravity.RIGHTGravityCompat.START, GravityCompat.END

(强调我的):

抽屉定位和布局是使用子视图上的 android:layout_gravity 属性控制的,对应于您希望抽屉从视图的哪一侧出现:。(或在支持布局方向的平台版本上开始/结束。)

源代码

public void setDrawerLockMode(int lockMode, int edgeGravity) {
  final int absGrav = GravityCompat.getAbsoluteGravity(edgeGravity,
                                                       ViewCompat.getLayoutDirection(this));
  if (absGrav == Gravity.LEFT) {
    mLockModeLeft = lockMode;
  } else if (absGrav == Gravity.RIGHT) {
    mLockModeRight = lockMode;
  }
  if (lockMode != LOCK_MODE_UNLOCKED) {
    // Cancel interaction in progress
    final ViewDragHelper helper = absGrav == Gravity.LEFT ? mLeftDragger : mRightDragger;
    helper.cancel();
  }
  switch (lockMode) {
    case LOCK_MODE_LOCKED_OPEN:
      final View toOpen = findDrawerWithGravity(absGrav);
      if (toOpen != null) {
        openDrawer(toOpen);
      }
      break;
    case LOCK_MODE_LOCKED_CLOSED:
      final View toClose = findDrawerWithGravity(absGrav);
      if (toClose != null) {
        closeDrawer(toClose);
      }
      break;
      // default: do nothing
  }
}

该方法本身仅检查重力是否为LEFTRIGHT(但使用一种GravityCompat方法,因此START并且END应该适当地翻译)。

这意味着通过将重力设置为"start|bottom",您将引入无效的重力,这会导致setDrawerLockMode()什么也不做。

2022-06-22