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:

  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?

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 .

  • ¿Diversas vistas para el artículo del hilandero y del hilandero?
  • imagen de ajuste de androide en imagen
  • Custom ExpandableListview Android
  • ¿Es posible pasar un onTouchEvent a varias vistas en Android?
  • Androide ProgressDialog: configuración de vista personalizada en lugar de mensaje - ¿este trabajo?
  • Ver movido pero aún en la esquina superior izquierda
  • Android doble lista de correo expandible oculta los elementos si la lista es demasiado grande
  • ExpandableListView con arrastrar y soltar de elementos de la lista en Android
  • ListView muestra imágenes incorrectas y duplicadas
  • Vista web de Android en la mitad de la pantalla
  • Cargar HTML estático en Webview
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.