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

  • ActionBarCompat + NavigationDrawerFragment no funciona en android 4.0 y 4.1
  • Cómo deslizar el ActionBar junto con el NavigationDrawer
  • NavigationView y ActionBarDrawerToggle
  • Barra de herramientas y NavigationDrawer
  • Cómo configurar un observador para actualizar el cajón de navegación después de que el método onActivityResult recibió un resultado de intención
  • Ocultar ActionBar MenuItems cuando se desliza el cajón de navegación para cualquier cantidad
  • El cajón de la navegación se contrae al cerrar
  • Indicador de cajón en lollipop play store
  • Android NavigationView grupo de menús divider
  • Colorear la barra de estado de Android en Nav Drawer
  • Barra de navegación translúcida Lollipop (fitsSystemWindows = "true")
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.