Android onTouch con onClick y onLongClick

Tengo una vista personalizada que actúa como un botón. Quiero cambiar el fondo cuando el usuario lo presione, revertir el fondo a original cuando el usuario mueve el dedo afuera o lo suelta y también quiero manejar eventos onClick / onLongClick. El problema es que onTouch requiere que devuelva true para ACTION_DOWN o no me envíe el evento ACTION_UP . Pero si vuelvo verdadero, el oyente onClick no funcionará.

Pensé que lo resolví volviendo falso en onTouch y registrando onClick – de alguna manera funcionó, pero estaba un poco contra los documentos. Acabo de recibir un mensaje de un usuario diciéndome que no puede hacer clic en el botón, así que me pregunto qué hay de malo aquí.

Parte del código actual:

 public boolean onTouch(View v, MotionEvent evt) { switch (evt.getAction()) { case MotionEvent.ACTION_DOWN: { setSelection(true); // it just change the background break; } case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: case MotionEvent.ACTION_OUTSIDE: { setSelection(false); // it just change the background break; } } return false; } public void onClick(View v) { // some other code here } public boolean onLongClick(View view) { // just showing a Toast here return false; } // somewhere else in code setOnTouchListener(this); setOnClickListener(this); setOnLongClickListener(this); 

¿Cómo los hago trabajar juntos correctamente?

Gracias por adelantado

onLongClick & onLongClick es realmente despachado desde View.onTouchEvent .

Si reemplaza View.onTouchEvent o establece algún View.OnTouchListener específico a través de setOnTouchListener , debe tener cuidado con eso.

Por lo que su código debe ser algo como:

 Public boolean onTouch (Ver v, MotionEvent evt)
 {
   // para enviar el evento click / click largo,
   // debe pasar el evento a su devolución de llamada predeterminada View.onTouchEvent
   Boolean defaultResult = v.onTouchEvent (evt);

   Switch (evt.getAction ())
   {
     Case MotionEvent.ACTION_DOWN:
     {
       SetSelection (true);  // simplemente cambiando el fondo
       descanso;
     }
     Case MotionEvent.ACTION_CANCEL:
     Case MotionEvent.ACTION_UP:
     Case MotionEvent.ACTION_OUTSIDE:
     {
       SetSelection (false);  // simplemente cambiando el fondo
       descanso;
     }
     defecto:
       Return defaultResult;
   }

   // si llegas aquí, has consumido el evento
   Devuelve verdadero;
 }
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.