Cómo procesar todos los TouchEvents a nivel de ViewGroup (es decir, burbujear todos los eventos hasta que contengan viewgroup)

Me gustaría procesar todos los eventos táctiles a nivel de contenedor. En otras palabras, quiero que todos los eventos de toque alcancen el nivel de contenedor. En este momento estoy descubriendo que TouchEvents sólo alcanzan el grupo ViewGroup si la ubicación del toque no desembarca en un componente de interfaz de usuario que está contenido por el grupo de vistas. El Elemento de interfaz de usuario contenido procesa el TouchEvent y no burbujea hasta el contenedor. ¿Alguien sabe cómo garantizar que todos los eventos táctiles lleguen al contenedor de nivel superior?

Sólo para ser claro, imaginar una actividad con varios botones, varios textos de edición, y varias casillas de verificación. Una forma típica. Normalmente estoy viendo que cada componente de IU atrapará el TouchEvent que cae sobre él y el contenedor no es el más sabio. Así que quiero saber cómo el contenedor / grupo de vista podría ser informado de todos los toques que aterrizan en cualquier lugar dentro de su región, independientemente de si esa región está ocupada con un botón, un espacio vacío o un texto de edición.

Así interpreto su pregunta:

Tienes Ver árbol como éste

  • ViewGroup G
    • Ver A
    • Ver B

Y usted quiere que G maneje el MotionEvent creado en el tacto incluso si fue consumido por cualquiera de A, B, …


Cómo:

Te daré dos opciones. Dependiendo de si desea ignorar el consumo por

  1. Cada niño
  2. Sólo niños seleccionados

Utilice una de las siguientes plantillas:

  1. Reemplazar dispatchTouchEvent () en G

    // In G @Override public boolean dispatchTouchEvent(MotionEvent event) { super.dispatchTouchEvent(event); // Handle event here instead of using an OnTouchListener return true; } 
  2. Anular dispatchTouchEvent () en cada niño cuyo consumo debe ser ignorado

    • Ignorar a algunos niños

       // In every child whose consumption should be ignored @Override public boolean dispatchTouchEvent(MotionEvent event) { super.dispatchTouchEvent(ev); return false; // false means "I did not consume the event" } 
    • No olvide configurar su oyente

       // In G, before touch should be recognized setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // Handle event here return true; // true means "I did consume the event" } }); 

Medido en líneas de código, la opción 1 es mucho más simple. Opción 2 es sólo en caso de que necesite un tratamiento especial para algunos de A, B …

Sé que es tarde, pero creo que los futuros lectores podrían querer ver ViewGroups.onInterceptTouchEvent () .

  • Herencia de estilo en Android
  • RelativeLayout textviews superpuestas
  • Inserción de contenido con escala escalable personalizada
  • Uso de Enums como atributos XML personalizados
  • Android: establece una vista para estar encima de los elementos dibujados con lienzo
  • Adición de título a la ventana de Android cuando se usa PhoneGap
  • Cambiar el valor del borde de desvanecimiento de NumberPicker o cambiar alfa del texto superior / inferior
  • Fuerza el teclado suave para mostrar cuando EditText consigue el foco
  • Teclado EditarEdición de Android no mostrado en Fragmento
  • Deshabilitar las teclas DPAD en android
  • Cómo hacer ImageView pantalla completa programmaticly en hacer clic?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.