wyłącz gest machnięcia, który otwiera szufladę nawigacji w Androidzie

Odpowiedzi:

438

Powinieneś użyć:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

To działało dla mnie, przeciągnięcie, aby otworzyć szufladę, było wyłączone.

Jeśli nadal nie działa, sprawdź odpowiedź podaną tutaj .

Tran Hieu
źródło
1
Jesteś pewny? Próbowałem, ale oba były otwarte. Testowałem na Androidzie 2.3x ze szkieletem ActionBarSherlock.
thanhnh
94
Aby to wyjaśnić: DrawerLayout.LOCK_MODE_LOCKED_OPEN blokuje szufladę do stanu otwartego, aby użytkownik nie mógł jej ukryć. DrawerLayout.LOCK_MODE_LOCKED_CLOSED blokuje szufladę do stanu zamkniętego, aby użytkownik nie mógł jej otworzyć. Wreszcie DrawerLayout.LOCK_MODE_UNLOCKED odblokowuje szufladę, aby można ją było otworzyć lub zamknąć.
egfconnor
4
Jeśli jeszcze tego nie masz mDrawerLayout, ustaw to w następujący sposób:mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Steve Liddle
4
Ale co powiesz na to, czy chcemy kontrolować otwieranie / zamykanie tylko za pomocą ikony aplikacji, a nie przesuwanie? Czy jest na to sposób? Jestem ciekawy, ponieważ próbuję wdrożyć nowy ToolBar(API 21) i użyć jego SlidingTabLayoutfunkcji, która jest w konflikcie z moim Nav. przeciąganie szuflady. Wolałbym więc wyłączyć Nav. prowadnica szuflady na korzyść ToolBarfunkcji przesuwu.
Azurespot
2
wyłącza to całą szufladę (np. ikona już nie działa), nie tylko przesuwanie, dlatego nie odpowiedział na pytanie - które konkretnie dotyczyło przesuwania
HelloWorld
101

w celu zablokowania możesz to zrobić:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

i do odblokowania:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
saleh sereshki
źródło
Dziękujemy za wyjaśnienie przyjętej odpowiedzi za pomocą flagi LOCK_MODE_UNLOCKED
Mattia Ruggiero
1
Myślę, że jest to lepsze niż zaakceptowana odpowiedź, ponieważ wprowadza również metodę przeciwną
TheWhiteLlama
Jeśli użyłem mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED); do zablokowania zamknął szufladę, więc do zablokowania użyłem mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_OPEN);
SH Mehdi
15

Dodaj także wartość grawitacji podczas korzystania z setDrawerLockMode () ;

Zrób to :

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

To powinno działać jak urok

Burhan Shakir
źródło
2
mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED); zablokuj zarówno Drawer, jak i drawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END); reprezentują szufladę, którą chcesz zablokować, dzięki człowieku, działa dla mnie i oszczędzam mój czas.
Sanjeev Sangral
W obecnych źródłach wygląda na to, że 3 dla lewej i 5 dla prawej będą działać zgodnie z oczekiwaniami, ale GravityCompat.END nie.
ProjectJourneyman
6

Aby wyłączyć przeciąganie, ręcznym onInterceptTouchEventi onTouchEventna DrawerLayouti mieć je return false.

Witaj świecie
źródło
To jest poprawna odpowiedź. Pozwól mi rozwinąć to nieco bardziej w odpowiedzi.
Martin Vysny,
4

Odpowiedź na wyłączenie przesuwania jest poprawna. Myślę, że LOCK_MODE_LOCKED_CLOSED działał w Compat 24.x, ale funkcjonalność została zmieniona w nowszych bibliotekach kompatybilnych, a LOCK_MODE_LOCKED_CLOSED całkowicie uniemożliwia wyświetlanie menu nawigacyjnego, nawet za pomocą menu hamburgera.

Następująca klasa działa dla mnie (Kotlin):

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)
  }
}
Martin Vysny
źródło
0

To działa dla mnie

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, {Your drawer view});
użytkownik350524
źródło