désactiver le geste de balayage qui ouvre le tiroir de navigation dans Android

Réponses:

438

Tu devrais utiliser:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

Cela a fonctionné pour moi, le balayage pour ouvrir le tiroir était désactivé.

Si cela ne fonctionne toujours pas, consultez la réponse fournie ici .

Tran Hieu
la source
1
Êtes-vous sûr? J'ai essayé mais il était ouvert et fermé, les deux. Je testais sur Android 2.3x avec le framework ActionBarSherlock.
thanhnh
94
Pour clarifier: DrawerLayout.LOCK_MODE_LOCKED_OPEN verrouille le tiroir à l'état ouvert afin que l'utilisateur ne puisse pas le cacher. DrawerLayout.LOCK_MODE_LOCKED_CLOSED verrouille le tiroir à l'état fermé afin que l'utilisateur ne puisse pas l'ouvrir. Enfin, DrawerLayout.LOCK_MODE_UNLOCKED déverrouille le tiroir afin qu'il puisse être ouvert ou fermé.
egfconnor
4
Si vous ne l'avez pas déjà fait mDrawerLayout, réglez-le comme suit:mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Steve Liddle
4
Mais qu'en est-il si nous voulons contrôler l'ouverture / la fermeture avec l'icône de l'application uniquement, et non en balayant? Y-a-t-il un moyen de faire ça? Je suis curieux car j'essaie d'implémenter la nouvelle ToolBar(API 21) et d'utiliser la SlidingTabLayoutfonctionnalité dont elle dispose, qui est en conflit avec mon Nav. tiroirs. Je préfère donc désactiver la navigation. glissière de tiroir en faveur de la ToolBarfonction coulissante.
Azurespot du
2
cela désactive tout le tiroir (par exemple, l'icône ne fonctionne plus), pas seulement le balayage, donc n'a pas répondu à la question - qui faisait spécifiquement référence au balayage
HelloWorld
101

pour le verrouillage, vous pouvez le faire:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

et pour déverrouiller:

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
Saleh Sereshki
la source
Merci d'avoir clarifié la réponse acceptée avec le drapeau LOCK_MODE_UNLOCKED
Mattia Ruggiero
1
Je pense que c'est mieux que la réponse acceptée car elle introduit également la méthode opposée
TheWhiteLlama
Si j'ai utilisé mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED); pour le verrouiller, il a fermé le tiroir donc, pour le verrouillage, j'ai utilisé mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_OPEN);
SH Mehdi
15

Ajoutez également une valeur de gravité lors de l'utilisation de setDrawerLockMode () ;

Faites ceci:

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

Cela devrait fonctionner comme un charme

Burhan Shakir
la source
2
mDrawerLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED); verrouiller à la fois le tiroir et le tiroirLayout.setDrawerLockMode (DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END); représentez quel tiroir vous voulez verrouiller, merci mec, cela fonctionne pour moi et économisez mon temps
Sanjeev Sangral
Dans les sources actuelles, il semble que 3 pour la gauche et 5 pour la droite fonctionneront comme prévu, mais GravityCompat.END ne fonctionne pas.
ProjectJourneyman
6

Pour désactiver glisser, override onInterceptTouchEventet onTouchEventsur DrawerLayoutet de les retourner faux.

Bonjour le monde
la source
C'est la bonne réponse. Permettez-moi de développer un peu plus cela dans la réponse.
Martin Vysny
4

La réponse pour désactiver le balayage est la bonne. Je pense que LOCK_MODE_LOCKED_CLOSED fonctionnait dans Compat 24.x, mais la fonctionnalité a été modifiée dans les bibliothèques de compatibilité plus récentes et LOCK_MODE_LOCKED_CLOSED empêche maintenant complètement le menu de navigation de s'afficher, même en utilisant le menu hamburger.

La classe suivante fonctionne pour moi (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
la source
0

Cela fonctionne pour moi

mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, {Your drawer view});
user350524
la source