2011-08-25 46 views
5

Problema:Android :: OnTouchListener && OnClickListener tema combinación Descripción

Tengo un TextView en un RelativeLayout y quiero darle color rojo cuando el usuario toca, e ir en otra página cuando se hace clic en él. Así que traté de configurar un OnClickListener para hacer clic y un OnTouchListener para implementar la función táctil (MotionEvent.ACTION_DOWN) pero esta combinación no funciona, porque OnTouchListener hace que OnClickListener no funcione (no sé por qué).

En los foros de la gente dice que podemos poner en práctica el OnClick por el OnTouch MotionEvent.ACTION_UP, pero éste puede ser disparado de mi diseño TextView (se hace clic en el TextView va si lo pulsa y arrastra el dedo de él para liberar) y este no es el comportamiento deseado porque quiero:
click = press + release en el TextView.

¿Alguien puede darme una solución para esto por favor?

Respuesta

3

Adel, ¿es el problema con el primer clic o no recibe ningún clic?

Existe este problema si tiene varios diseños clicables y no obtiene ningún evento de clic para el primero. Eso es porque lo hace primero seleccionado y luego obtienes el evento click, prueba el siguiente código.

private class CustomTouchListener implements OnTouchListener { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     TextView tv = (TextView) v.findViewById(R.id.single_line_text); 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      tv.setTextColor(COLOR_WHEN_PRESSED); 
     } else if (event.getAction() == MotionEvent.ACTION_UP) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
      // Action of click goes here 
     } else if (event.getAction() == MotionEvent.ACTION_CANCEL) { 
      tv.setTextColor(COLOR_WHEN_RELEASED); 
          // To handle release outside the layout region 
     } 
     return false; 
    } 
} 

Esto está funcionando en mi implementación actual si configura el oyente táctil para su diseño.

También es necesario establecer por debajo de su diseño

android:focusable="true" 
android:focusableInTouchMode="true" 
android:clickable="true" 

creo que sirve !!!

EDITAR: Además, debe haber una bandera tanto en ABAJO como ARRIBA. Ajústelo en ABAJO y verifique si está configurado en ARRIBA. Esto evitará un error en el que el usuario puede tocar en cualquier parte de la pantalla y luego pasar el cursor sobre su vista de texto y soltarlo.

+0

¡Muchas gracias! Definitivamente me ayudaste. El truco para mí fue establecer las tres propiedades que dijiste ... – harsimranb

+0

¡Gracias por la ayuda! Me faltaba el android: enfocable = "verdadero" en mi TextView – Gatekeeper

21

puede llamar a View.performClick() cuando action_up. Espero eso ayude.

your_txtView.setOnClickListener(new TextView.OnClickListener(){ 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 

     } 
    }); 

    your_txtView.setOnTouchListener(new TextView.OnTouchListener(){ 
      @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (MotionEvent.ACTION_DOWN == event.getAction()) { 

     } else if (MotionEvent.ACTION_UP == event.getAction()) { 
      v.performClick(); 
     } 

     return true; 
    } 
    }); 
+0

tuve el mismo problema ... y v.performClick trabajo hermoso ... esta es la solución ... por favor acepte la respuesta –

+0

+1, esto es lo que Estaba buscando. – tokudu

+0

Gracias Sven. Esto es asombroso – aNoviceGuy

2

Tenía el mismo problema. Lo resolvió devolviendo false de ACTION_MOVE. He estado peleando con él durante algunas horas, probando varias cosas, pero parece que he seguido pasando por alto este pequeño problema ... Y ahora tiene sentido. Cuando regresa true desde onTouch, se detiene el procesamiento posterior, de modo que OnClickListener no tiene conocimiento de ningún movimiento y desencadenador en Click incluso después de que el puntero se haya movido fuera de la vista.

+0

En nombre de @ bugs99 que no puede agregar comentarios por falta de reputación: Al cambiar 'return true' por' return false', puede realizar la acción 'onTouchListener()' y luego pasar el evento touch al 'onClickListener()'.Con esto, no hay necesidad de realizar explícitamente el 'performClick()' – gturri

Cuestiones relacionadas