¿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.

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"

  • Hacer fragmento que se puede hacer clic al abrir el cajón de navegación
  • ¿Es este un uso correcto de Android Fragments y NavigationDrawer?
  • ¿Cómo agregar el indicador de "menú" junto al icono de la aplicación de Barra de Acción?
  • Cómo agregar un elemento de menú plegable dentro del cajón de navegación en android?
  • Cajón de navegación - Desactivar clic en los elementos detrás del cajón
  • No se puede agregar pestañas dentro de Fragmento de cajón de navegación Android
  • Selección de elementos de fila de reciclaje
  • Cajón de navegación coexistente y diseño de panel deslizante
  • Cambiar elementos de NavigationView cuando el usuario está registrado
  • ¿Cómo utilizar el diseño de material de acción barra de navegación de cajón animación de conmutación?
  • Buenas prácticas: Cajón de navegación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.