¿Por qué DrawerLayout a veces falla al abrirse?

He seguido el tutorial de navegación de cajón y todo funciona como un encanto a excepción de un pequeño problema. Voy a tratar de explicar lo más posible, y si todavía no está claro, voy a tratar de subir un video del problema.

El problema ocurre cuando se intenta abrir el cajón y sólo cuando se abre, y sólo ocurre a veces, no siempre. Ahí es cuando empiezo a abrirlo falla y congela con unos 4 milímetros abiertos, y siempre la misma distancia. Entonces no seguiría abriendo ni cerrando de nuevo si muevo mi dedo hacia atrás, cuando lo suelto, se cierra.

Tenga en cuenta:

  • Lo he probado en dispositivos múltiples (Nexus 7, Nexus) y dispositivos virtuales, así, el problema persiste.
  • Problema replicado utilizando el ejemplo proporcionado por Google. (Enlace de Youtube)
  • Problema presentado con mi aplicación. (Enlace de Youtube)
  • Me las arreglé para replicar el problema una vez, pero sólo una vez en la aplicación de Gmail (que creo que utiliza la misma aplicación), sin embargo mucho más frecuente con mi aplicación y la aplicación de ejemplo.
  • Me di cuenta de que la falla ocurre a la misma distancia de la cual el cajón se abre si sólo hace clic en el borde de la pantalla, ya que en que se congela después de apertura inicial y nunca arrastra.

Cualquier indicador sería apreciada.

2 Solutions collect form web for “¿Por qué DrawerLayout a veces falla al abrirse?”

Investigué el código de DrawerLayout y encontré el siguiente problema: Cuando tocamos el borde de la pantalla, aparece una parte pequeña (20 * densidad px) del drawer (hace que el cajón móvil sea más fácil). No aparece de inmediato, pero después de un cierto intervalo (160 ms) de tiempo. Se realiza por postDelayed .

El drawer puede estar en varios estados: IDLE , DRAGGING y DRAGGING . Si estaba en el estado DRAGGING , no puede volver a este estado con el mismo puntero y borde (porque hay una condición: mEdgeDragsInProgress[pointerId] & edge) == edge que no permite arrastrar el borde que se han Arrastrando ya).

Así que en algunos casos el cajón se ha movido al estado DRAGGING ya cuando se está ejecutando Runnable retrasado. Esta acción retrasada abre el drawer para px de 20 * de densidad y cambia el estado del drawer . Así que el drawer no se puede mover más (porque no puede volver al estado DRAGGING ).

Hay un código para cancelar la acción retardada (que abre el cajón), pero este código en el método onInterceptTouchEvent , que se llama sólo una vez (porque devuelve false ). Creo que este código debe estar en el método onTouchEvent .

Desafortunadamente no encontré ninguna manera de cancelar el evento retrasado (porque tiene modificador private y no puedo conseguirlo). Tan sólo una manera que encontré: copiar el código fuente de DrawerLayout a mi proyecto y hacer este pequeño cambio: copy

 case MotionEvent.ACTION_MOVE: { // If we cross the touch slop, don't perform the delayed peek for an edge touch. if (mLeftDragger.checkTouchSlop(ViewDragHelper.DIRECTION_ALL)) { mLeftCallback.removeCallbacks(); mRightCallback.removeCallbacks(); } break; } 

Desde el método onInterceptTouchEvent hasta el método onTouchEvent .

No hay ningún error en el archivo drawerlayout. Simplemente agregue un ScrollView como la vista padre o raíz al archivo content.xml (archivo setcontentview) y las herramientas: context = ". MainActivity"

  • No se puede bloquear el evento de clic de botón de inicio de la barra de herramientas
  • ¿Cómo puedo hacer que un elemento específico del cajón de navegación aparezca seleccionado?
  • Nuevo ícono oficial para Android Navigation Drawer
  • ¿Cómo agregar valor de notificación para el elemento en NavigationView para el cajón de diseño de material?
  • Salir de la aplicación cuando presione el botón Atrás en actividad con múltiples fragmentos en el Gaveta de navegación
  • El cajón de navegación en android no está en pantalla completa
  • El cajón de navegación inhabilita la vista trasera cuando el cajón está abierto
  • FragmentManager.beginTransaction () no se puede aplicar a (int, android.app.fragment)
  • Norma de arquitectura de Android MVP para cargar interfaz de usuario con clase Model que tiene recurso android
  • Elementos de menú de la bandeja de navegación seleccionados dentro de diferentes grupos
  • La mejor manera de implementar un cajón de desplazamiento de navegación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.