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 .


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);

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


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.


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)
  }
}

0

To działa dla mnie

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, {Your drawer view});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.