вимкніть жест пальцем, який відкриває ящик для навігації в android


187

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

Я хотів би відключити жест, щоб відкрити навігаційний ящик, хтось має уявлення, як це зробити?

Відповіді:


438

Ви повинні використовувати:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

Це працювало для мене, проведіть пальцем, щоб відкрити шухляду.

Якщо вона все ще не працює, перегляньте відповідь, надану тут .


1
Ти впевнений? Я спробував, але це було відключено відкритим і закритим, і те, і інше. Я тестував на android 2.3x за допомогою ActionBarSherlock Framework.
ніжнх

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. витягування ящика. Тому я б швидше відключив 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, так і drawerLayout.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, але функціональність була змінена в новіших бібліотеках компат, і 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.