отключить жест пальцем, который открывает ящик навигации в Android

Ответы:

438

Вы должны использовать:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

У меня это сработало, удар по открытию ящика был отключен.

Если это все еще не работает, проверьте ответ, предоставленный здесь .

Чан Хиеу
источник
1
Ты уверен? Я пытался, но это было открыто и закрыто, оба. Я тестировал на Android 2.3x с каркасом ActionBarSherlock.
thanhnh
94
Для пояснения: DrawerLayout.LOCK_MODE_LOCKED_OPEN блокирует ящик в открытом состоянии, чтобы пользователь не мог его скрыть. DrawerLayout.LOCK_MODE_LOCKED_CLOSED блокирует ящик в закрытом состоянии, поэтому пользователь не может открыть его. Наконец, DrawerLayout.LOCK_MODE_UNLOCKED открывает ящик, чтобы его можно было открывать или закрывать.
egfconnor
4
Если у вас его еще нет mDrawerLayout, установите его следующим образом:mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Стив Лиддл
4
Но как быть, если мы хотим контролировать открытие / закрытие только с помощью значка приложения, а не смахивания? Есть ли способ сделать это? Мне любопытно, потому что я пытаюсь реализовать новый ToolBar(API 21) и использовать SlidingTabLayoutимеющуюся у него функцию, что противоречит моему Nav. смахивание ящика. Так что я бы лучше отключил Нав. выдвижной ящик в пользу функции ToolBarскольжения.
Azurespot
2
это отключает весь ящик (например, иконка больше не работает), а не просто смахивание, следовательно, не отвечает на вопрос - который конкретно относится к смахиванию
HelloWorld
101

для блокировки вы можете сделать это:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

и для разблокировки:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
Салех Серешки
источник
Спасибо за разъяснение принятого ответа с флагом LOCK_MODE_UNLOCKED
Маттиа Руджеро
1
Я думаю, что это лучше, чем принятый ответ, поскольку он также вводит противоположный метод
TheWhiteLlama
Если бы я использовал mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED); для блокировки он закрыл ящик, поэтому для блокировки я использовал mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_OPEN);
SH Мехди
15

Также добавьте значение силы тяжести при использовании setDrawerLockMode () ;

Сделай это :

drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END);

Это должно работать как шарм

Бурхан Шакир
источник
2
mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED); заблокировать и Drawer, и BoxLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END); Представьте, какой ящик вы хотите заблокировать, спасибо, мужик, он работает для меня и экономит мое время.
Санджив Санграл
В текущих источниках, похоже, что 3 для левого и 5 для правого будут работать, как и ожидалось, но GravityCompat.END не работает.
ProjectJourneyman
6

Чтобы отключить Swiping, переопределение onInterceptTouchEventи onTouchEventна DrawerLayoutи иметь их возвращают ложь.

Привет мир
источник
Это правильный ответ. Позвольте мне подробнее остановиться на этом в ответе.
Мартин Высны,
4

Ответ на отключение смахивания является правильным. Я думаю, что LOCK_MODE_LOCKED_CLOSED работал в Compat 24.x, но функциональность была изменена в более новых библиотеках compat, и LOCK_MODE_LOCKED_CLOSED теперь полностью предотвращает отображение меню навигации, даже через меню гамбургеров.

У меня работает следующий класс (Котлин):

class MyDrawerLayout(ctx: Context) : DrawerLayout(ctx) {
  var isSwipeOpenEnabled: Boolean = true

  override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
      if (!isSwipeOpenEnabled && !isDrawerVisible(Gravity.START)) {
          return false
      }
      return super.onInterceptTouchEvent(ev)
  }

  @SuppressLint("ClickableViewAccessibility")
  override fun onTouchEvent(ev: MotionEvent): Boolean {
      if (!isSwipeOpenEnabled && !isDrawerVisible(Gravity.START)) {
          return false
      }
      return super.onTouchEvent(ev)
  }
}
Мартин Высний
источник
0

Это работает для меня

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, {Your drawer view});
user350524
источник