Почему я не могу заблокировать DrawerLayout с гравитацией макета - программирование

Почему я не могу заблокировать DrawerLayout с гравитацией макета

Я использую DrawerLayout, и недавно я хочу изменить гравитацию listView в drawerLayout. Но после того, как я изменил гравитацию listView на android:layout_gravity="start|bottom" с 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>

`

Любые подсказки, почему я не могу использовать режим блокировки с другими гравитациями?

Спасибо!

4b9b3361

Ответ 1

На основе документации доступны только доступные гравитации, которые можно использовать Gravity.LEFT, Gravity.RIGHT или GravityCompat.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
  }
}

Сам метод проверяет, действительно ли сила тяжести LEFT или RIGHT (но использует метод GravityCompat, поэтому START и END должны быть соответствующим образом переведены).

Это означало бы, что, установив гравитацию "start|bottom", вы вводите недействительную гравитацию, из-за чего setDrawerLockMode() ничего не делает.