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


187

Я следовал руководству по навигационному ящику от Google и хотел бы добавить его в активность с помощью вкладок и жестов.

Я хотел бы отключить жест, чтобы открыть навигационную панель. Кто-нибудь знает, как это сделать?

Ответы:


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});
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.