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 .

  • Cómo usar una misma fontface personalizada para toda la vista en android?
  • Activity.addContentView (Vista) == ViewGroup.addContentView (Ver)?
  • La superposición de una vista no deshabilita las acciones en la vista subyacente
  • Los métodos getTop (), getLeft (), getX (), getY (), getWidth (), getHeight () de la vista de Android
  • Desarrollo de Android: ¿Cómo puedo hacer un texto de edición sencilla por lo que es sólo un cuadrado blanco?
  • Acceso a TextView de viewview de groupview desde getChildView () de ExpandableListView
  • Cargar HTML estático en Webview
  • Android: WebView no puede mostrar el signo de porcentaje '%'
  • Spinner con ArrayAdapter personalizado para objetos que no muestran el elemento seleccionado
  • Cómo eliminar el espacio específico entre el padre y el niño en un ExpandableListView
  • Eliminar márgenes en webView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.