android - ejemplo - Manejo del evento táctil de intercepción sin extender ViewGroup
ontouchlistener android ejemplo (5)
Intente agregar onTouchListener a RelativeLayout
RelativeLayout rl = (RelativeLayout) findViewById( R.id.relativeLauout );
rl.setOnTouchListener( new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// do something
return false;
}
});
o use el método onTouchEvent de Activity
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return super.onTouchEvent(event);
}
Tengo un RelativeLayout
y este diseño tiene casi 10 vistas.
He configurado OnTouchListener
para este diseño y OnTouchListener
trabajando en él y volviéndolo true
.
este oyente funciona bien cuando toco el diseño donde no hay Vista (significa en el área Vacía). Si toco las vistas de niños de este diseño, este oyente no está disparando ...
y de la documentación, entendí que podemos anular onInterceptTouchEvent()
extendiendo ViewGroup (así que aquí RelativeLayout) y manejar eventos táctiles antes de que las vistas secundarias consuman este evento ...
esto hará un truco, pero necesito modificar muchos archivos xml donde necesito esta funcionalidad reemplazando RelativeLayout con mi CustomRelativeLayout.
entonces mi pregunta es:
¿Hay alguna manera de manejar el evento táctil para RelativeLayout
(ofcourse ViewGroup) antes de que las vistas secundarias en RelativeLayout
consuman el evento? No quiero extender RelativeLayout
...
Intente devolver falso en el método onTouchEvent()
de vistas secundarias al procesar el evento ACTION_DOWN
. Por lo tanto, los eventos táctiles de reenvío no se enviarán a las vistas secundarias, también conocido como evento no consumido.
Si bien no necesariamente es lo ideal, esto funciona bien para diseños más pequeños que no tendrán contenido dinámico.
En xml, configure android:clickable="false"
para todos los descendientes de ViewGroup en el diseño (incluidos los ViewGroups anidados y sus hijos). Cada niño al que se haga clic en él propagará el clic a su padre y, finalmente, accederá a los controladores táctiles predeterminados de ViewGroup. Asegúrese de establecer el grupo de vista raíz, donde desea obtener los eventos de clic como android:clickable="true"
o viewgroup.setClickable(true)
Si agrega vistas dinámicamente, asegúrese de llamar a view.setClickable(false);
Antes de agregarlo a la jerarquía de vistas.
Simplemente puede establecer en su xml:
android:clickable="true"
Trate de anular
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
de Activity
. Este método es el primero que procesa eventos táctiles. Pero en este caso necesitas trabajar con las coordenadas actuales de las vistas.