2010-08-06 43 views
5

Tengo un botón personalizado, en el que estoy capturando su onTouchEvent.Android: el botón personalizado OnClickListener no está siendo invocado

public class CustomNumber extends ToggleButton { 
boolean drawGlow = false; 
float glowX = 0; 
float glowY = 0; 
float radius = 30; 


public CustomNumber(Context context) { 
    super(context); 
} 


public CustomNumber(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 


public CustomNumber(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 


Paint paint = new Paint(); 
{ 
    paint.setAntiAlias(true); 
    paint.setColor(Color.WHITE); 
    paint.setAlpha(70); 
}; 

@Override 
public void draw(Canvas canvas){ 
    super.draw(canvas); 
    if(drawGlow) 
     canvas.drawCircle(glowX, glowY, radius, paint); 
} 

@Override 
public boolean onTouchEvent(MotionEvent event){ 
    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     drawGlow = true; 
    }else if(event.getAction() == MotionEvent.ACTION_UP) 
     drawGlow = false; 
    } 
    glowX = event.getX(); 
    glowY = event.getY(); 
    this.invalidate(); 
    return true; 
} 

Este botón personalizado es la parte de una cuadrícula. Cuando agrego este botón a la grilla, configuré OnClickListener para él. Pero, el código en OnClickListener nunca se invoca.

código GridAdapter, donde yo estoy añadiendo el botón con el oyente:

public View getView(final int position, final View convertView, final ViewGroup parent) { 
    CustomNumber tBtn; 
    if (convertView == null) { 
     tBtn = new CustomNumber(context); 
     tBtn.setTextOff(""); 
     tBtn.setTextOn(""); 
     tBtn.setChecked(false); 
     tBtn.setId(position); 
     tBtn.setOnClickListener(tBtnListener); 
     tBtn.setLayoutParams(new GridView.LayoutParams(35, 35)); 
    } else { 
     tBtn = (CustomNumber) convertView; 
    } 
    return tBtn; 
} 

por favor ayuda.

+0

Si elimino el código OnTouchEvent, entonces el código OnClickListener funciona. ¿No se pueden manejar ambos eventos juntos? ¡Por favor ayuda! – Pria

+1

no estoy seguro, pero ¿hay alguna diferencia si devuelve verdadero o falso en su onTouch al final? –

+0

He intentado devolver falso desde onTouchEvent(). no funciona :(Además, toma el evento como MotionEvent.ACTION_DOWN siempre – Pria

Respuesta

0

Supongo que el comentario de Mathias es correcto, debe devolver false en su método onTouchEvent cuando desee que se active el detector de eventos onClick() en lugar de un detector de eventos onTouch() subsiguiente.

Puede encontrar más precisión int UI Events documentation

+0

Intenté devolver falso desde onTouchEvent(). No funciona :(Además, toma el evento como MotionEvent.ACTION_DOWN siempre – Pria

+0

bien, olvídate return false. ¿Está seguro de que getView que establece onClickListener se llama? – Longfield

+0

tan pronto como comente mi código onTouchEvent ... el código onClickListener comience a funcionar :( – Pria

0

Puede usted acaba de ejecutar su código en OnTouchEvent (un clic es MotionEvent.ACTION_DOWN como ya saben)?

2

Intenta imponer OnTouchListener en tu actividad (en lugar de onClickListener) y cambia onClick() a onTouch(). Esto funcionó para mí. Se están llamando a onTouchEvent desde mi vista personalizada y onTouch() desde Activity. Recuerda devolver "false" en onTouch() y "true" en OnTouchEvent de tu vista personalizada.

6

En su aplicación onTouchEvent, en lugar de "return true;", hacer ...

return super.onTouchEvent(event); 

que estás anulando la implementación de la superclase que es lo que es responsable de llamar al oyente. Al llamar a la implementación de la superclase debería actuar como lo hacía antes. Esta es la razón por la que su código funciona cuando se comenta el método, porque ya no anula la implementación de la superclase

Cuestiones relacionadas