DrawerLayout evita la llamada de MainActivity.onTouchEvent ()
Tengo una aplicación que reemplaza el onTouchEvent(MotionEvent ev)
de la MainActivity
para determinar Two-Finger-Swipe
y Pich-Open
/ Pinch-Close
. Todo funciona bien hasta que agregue el DrawerLayout
a la aplicación (como se describe en Creación de un cajón de navegación ). Problema: el DrawerLayout
evita la llamada de onTouchEvent()
en MainActivity.
Comencé a escribir un CustomDrawerLayout
, e intento DrawerLayout
métodos de onInterceptTouch()
y onTouchEvent()
.
- ¿Cómo eliminar el retraso al abrir una actividad con un DrawerLayout?
- Oculte el mango de un cajón deslizante mediante programación
- CustomDrawerLayout de cuatro lados pantalla cuestión con Fling gesto y detección
- Cómo inhabilitar el deslizador abierto en DrawerLayout en Android?
- Cajón que no cubre la barra de acción
La única manera (que encontré) para transmitir el TouchEvent
a la MainActivity:
// onTouchEvent of CustomDrawerLayout @Override public boolean onTouchEvent(MotionEvent ev){ // super.onTouchEvent(ev); // prevent transmission of TouchEvent return false; }
El problema aquí es que el cajón no abre correctamente. El cajón se atasca como se describe en este post: DrawerLayout quedarse atrapado en el golpe .
¿Es posible transmitir el TouchEvent
a MainActivity para manejar el MultiTouchDetection? ¿O tengo que manejar esto en CustomDrawerLayout
?
ACTUALIZACIÓN 1
Primero tengo que decir que el cajón sólo se atasca, si golpeo desde el borde izquierdo. Al hacer clic en el DrawerIcon en el ActionBar
el cajón funciona bien. La transmisión de TouchEvent
funciona con el código siguiente. Pero sólo si el cajón está abierto! De lo contrario Activity.onTouchEvent
no se llama!
// onTouchEvent of CustomDrawerLayout @Override public boolean onTouchEvent(MotionEvent ev){ // super.onTouchEvent(ev); // still prevents transmission of TouchEvent activity.onTouchEvent(ev); return true; }
Al abrir el cajón con un golpe desde el borde (-> cajón de los atascos) tengo un comportamiento muy extraño:
- Sólo DrawerIcon puede cerrar "cajón estancado" (-> no esperaría algo diferente porque anular el
CustomDrawerLayout.onTouchEvent
) - Si cierro el cajón estancado por DrawersIcon el
CustomDrawerLayout.onTouchEvent
todavía se llama
¡Eso es extraño! ¿Por qué no se llama Activity.onTouchEvent()
? ¿Y cómo puedo evitar el cajón estancado?
ACTUALIZAR 2
Ahora anular el CustomDrawerLayout.onInterceptTouch()
:
@Override public boolean onInterceptTouchEvent(MotionEvent ev){ return true; }
Esto tiene el efecto de que el cajón no puede ser abierto por un golpe desde el borde -> sólo el DrawersIcon puede abrir y cerrar el cajón. Pero ahora el TouchEvent
siempre se transmite a la Actividad (-> que funciona como se esperaba).
Pero lo que realmente quiero es tener la posibilidad de abrir el cajón por un golpe desde el borde y tener mi MultiGestureDetector. es posible?
- Ver la vista previa del cajón de navegación
- Android Eliminar sombra en el cajón de navegación
- CoordinatorLayout NullPointerException en onTouchEvent
- Cómo hacer una pantalla completa DrawerLayout en Android?
- DrawerLayout - ClassNotFoundException durante la compilación con Android Studio y Gradle
- Comprobación de la posición actual del fragmento abierto durante el uso de DrawerLayout
- Mismo cajón de navegación en diferentes actividades
- SetDrawerLockMode no funciona en android?
Un poco de una actualización tardía, pero después de tener este problema durante un par de días, la solución que funcionó mejor para mí fue la creación de un CustomDrawerLayout. A continuación, publicar el Contexto del constructor como Actividad, denominado Actividad onTouchEvent de onInterceptTouchEvent.
@Override public boolean onInterceptTouchEvent( MotionEvent ev ) { getActivity().onTouchEvent( ev ); return super.onInterceptTouchEvent( ev ); }
Creo que el código para ser un hack cojo … pero funciona para mí. ¡Buena suerte!
Estaba teniendo algunos problemas para reconocer gestos para los elementos dentro del cajón de navegación en sí y encontré requestDisallowInterceptTouchEvent . Lo que encontré fue que estaba recibiendo el MotionEvent.ACTION_DOWN, pero nada después, porque el NavigationDrawer estaba interceptando los toques. La clave sería llamar a requestDisallowInterceptTouchEvent (true) en el evento de abajo en su controlador táctil en la actividad para que pueda manejar el toque sin que sea interceptado.
Esta presentación también fue muy útil al intentar averiguar el sistema táctil en Android.
En caso de que usted o alguien más lo necesite, aquí está mi implementación.
Funciona perfectamente con la excepción de la "ventaja" que no se toma del código de android sino como una constante (que he establecido).
Vea este enlace:
El gaviota de navegación de Android no pasa onTouchEvent a la actividad