¿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.
- FindViewById (int) en Activity no se puede aplicar a (int, android.support.v7.widget.Toolbar
- Cómo abrir diferentes actividades al hacer clic en los elementos del cajón de navegación?
- Cambiar el ícono de la hamburguesa del cajón de navegación
- Cajón de navegación - ¿qué hace syncState () y por qué debe llamarse dentro onPostCreate ()?
- El efecto de sombra superpuesto permanece en NavigationView del cajón de navegación
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.
- No se puede resolver el método getActivity ()
- Androide. ¿Cómo puedo deslizar NavigationDrawer de la biblioteca de pruebas Espresso?
- ¿Cómo mostrar el cajón de navegación en todas las actividades?
- Cajón de navegación debajo de la barra de herramientas
- El cajón de navegación en android no está en pantalla completa
- Cómo hacer navegación personalizada ver animaciones como ésta
- ¿Cómo puedo hacer que el cajón de navegación no cierre completamente el cajón izquierdo?
- Añadir 2 listview en el cajón de navegación, sólo uno funciona
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"
- Cómo capturar el evento onclick en disabled EditText en la aplicación de Android
- Android – cómo convertir int a cadena y colocarlo en un EditText?