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:
- Ver la inyección de dependencia con la daga 2
- Cuál es la ventaja de usar el espacio sobre la vista
- Cómo ampliar una vista de texto en android?
- addView no funciona
- Mostrar enormes imágenes en 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?
- El teclado de software redimensiona la imagen de fondo en Android
- Android: ¿Cómo pasar mejor los datos a una vista?
- Obtener el valor de color de píxel de un punto en una vista de Android que incluye un lienzo con respaldo de mapa de bits
- Android View y ViewGroup
- Animación de una vista mientras que ListView no está funcionando
- Cómo obtener un enum que se crea en attrs.xml en el código
- Superponer una capa Transparente de pantalla completa en Android 4.4 (KitKat)
- ¿Está declarando una clase interna en una vista peligrosa?
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