OnTouch funciona, pero OnClickListener no?
He creado un widget / control que puedo reutilizar lo que he creado al extender RelativeLayout
. Luego, en una de mis Actividades, creé un montón de estos widgets en un bucle. Sin embargo, me encontré con un problema cuando quería tener cada widget responder a un clic.
He encontrado que el ajuste OnTouchListener
funciona:
- ¿Android View.postDelayed referencia de la fuga?
- ¿Por qué onTouchEvent de SurfaceView llamado unos segundos retrasados?
- Cómo aplicar un filtro de color a una vista con todos los niños
- compruebe si existe una vista desde un inflador de diseño antes de añadir otro
- ¿Cómo mostrar html / páginas web externas dentro de la aplicación android?
this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { //Triggers debug message } });
pero OnClickListener
no:
this.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //Doesn't trigger debug message } });
¿Por qué es esto?
- Vista flotante en la pantalla de Android
- Lista de posición de los puntos repetidos en getview
- Widgets de Android: Cómo agregar vistas a RemoteViews en tiempo de ejecución
- Vista superficial en capas en un FrameLayout en Android
- ¿Por qué se ignoran los clics en mi ExpandableListView?
- Animación de la traducción y ampliación de la vista en Android
- ¿Cómo mostrar la lista desplegable-ver debajo de la vista particular en android?
- Android ClassCastException al recuperar Vista personalizada
Aquí hay algunas cosas para comprobar para asegurarse de que sus vistas son clickable:
View.setClickable() View.setEnabled() View.setFocusable() View.setFocusableInTouchMode()
Dependiendo del comportamiento exacto que esperes obtener, necesitarás establecer uno o más de estos en. Puesto que usted está recibiendo eventos onTouch, mi conjetura es que usted necesita setClickable. Pero tendría que ver el código de creación de vista para estar seguro.
Debe asegurarse de que el TouchListener no está "consumiendo" el evento táctil. Si devuelve true del método onTouch()
, Android lo considerará consumido y no lo pasará a los otros manejadores de toques (lo que supongo incluirá el ClickListener).
Deberías hacer:
this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { //Triggers debug message return false; } });
¿Está devolviendo el valor booleano onTouch correctamente?
De los documentos:
onTouch () : devuelve un booleano para indicar si su oyente consume este evento. Lo importante es que este evento puede tener múltiples acciones que se suceden. Por lo tanto, si devuelve false cuando se recibe el evento de acción descendente, indica que no ha consumido el evento y tampoco está interesado en las acciones posteriores de este evento. Por lo tanto, no se le pedirá ninguna otra acción dentro del evento, como un gesto con el dedo o el evento de acción final.
EDITAR
Encontré la solución en esta pregunta y lo probé yo mismo.
Necesita utilizar este return super.onTouchEvent(event);
en su código onTouchEvent. Después de agregar esto, el OnClickListener empezó a funcionar.
Para realizar esta devolución falsa en su onTouch()
así:
this.setOnTouchListener(new OnTouchListener(){ public boolean onTouch(View arg0, MotionEvent arg1) { return false; } });
Puede implementar un onClickListener a través de onTouchListener:
webView.setOnTouchListener(new View.OnTouchListener() { public final static int FINGER_RELEASED = 0; public final static int FINGER_TOUCHED = 1; public final static int FINGER_DRAGGING = 2; public final static int FINGER_UNDEFINED = 3; private int fingerState = FINGER_RELEASED; @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: if (fingerState == FINGER_RELEASED) fingerState = FINGER_TOUCHED; else fingerState = FINGER_UNDEFINED; break; case MotionEvent.ACTION_UP: if(fingerState != FINGER_DRAGGING) { fingerState = FINGER_RELEASED; // Your onClick codes } else if (fingerState == FINGER_DRAGGING) fingerState = FINGER_RELEASED; else fingerState = FINGER_UNDEFINED; break; case MotionEvent.ACTION_MOVE: if (fingerState == FINGER_TOUCHED || fingerState == FINGER_DRAGGING) fingerState = FINGER_DRAGGING; else fingerState = FINGER_UNDEFINED; break; default: fingerState = FINGER_UNDEFINED; } return false; } });
Si anula el método onMotionEvent () por alguna razón y necesita devolver true / false en ese caso, puede activar manualmente la devolución de llamada OnClickListener () llamando a this.performClick () dentro del onMotionEvent () anulado justo antes de devolver true /falso.
Cuando necesite los eventos onClick y onTouch en la misma vista, utilice un GestureDetector .
- El fragmento de inicio de sesión de Facebook cierra la aplicación, utilizando Facebook SDK 3.0.1
- Limitar la longitud de TextView