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

  • Cajón de navegación con cabeceras / secciones
  • Cómo obtener elementos en el cajón de navegación para cambiar la vista
  • Android Api 23 Cambiar Navegación Ver headerLayout textview
  • NavigationDrawer con Actividades vs. NavigationDrawer con Fragments
  • Diseño del cajón de navegación el título en la barra de herramientas no cambia
  • Android: 2 o más ExpandableListView dentro del Gaveta de navegación
  • No abra el cajón de navegación de forma predeterminada
  • DrawerLayout con AdMob Ad
  • Cajón de navegación de estilo de material, el color de la barra de estado se pone demasiado oscuro
  • ¿Cómo puedo hacer que el cajón de navegación no cierre completamente el cajón izquierdo?
  • Android UiAutomatorViewer no puede detectar algunas vistas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.