2010-08-06 7 views
5

J'ai un bouton personnalisé, sur lequel je capture son onTouchEvent.Android: bouton OnClickListener personnalisé n'est pas invoqué

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; 
} 

Ce bouton personnalisé fait partie d'une grille. Lorsque j'ajoute ce bouton à la grille, j'y ai ajouté un OnClickListener. Mais, le code dans OnClickListener n'est jamais appelé.

code GridAdapter, où j'ajoute le bouton avec l'auditeur:

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; 
} 

S'il vous plaît aider.

+0

Si je supprime le code OnTouchEvent, le code OnClickListener fonctionne. Les deux événements ne peuvent-ils pas être traités ensemble ??? S'il vous plaît aider! – Pria

+1

pas sûr mais une différence si vous retournez vrai ou faux dans votre onTouch à la fin? –

+0

J'ai essayé de retourner false à partir de onTouchEvent(). cela ne fonctionne pas :(En outre, il prend l'événement comme MotionEvent.ACTION_DOWN toujours – Pria

Répondre

0

Je suppose que le commentaire de Mathias est correct, vous devez retourner false dans votre méthode onTouchEvent lorsque vous voulez que l'écouteur d'événement onClick() soit déclenché au lieu d'un écouteur d'événement onTouch() suivant.

Vous pouvez trouver plus de précision int UI Events documentation

+0

J'ai essayé de retourner false de onTouchEvent(). cela ne fonctionne pas :(En outre, il prend l'événement comme MotionEvent.ACTION_DOWN toujours – Pria

+0

ok, oubliez Vous êtes alors sûr que getView qui définit l'onClickListener est appelé? – Longfield

+0

dès que je commente mon code onTouchEvent ... le code onClickListener commence à fonctionner :( – Pria

0

Pouvez-vous exécuter simplement votre code dans OnTouchEvent (un clic est MotionEvent.ACTION_DOWN comme vous le savez déjà)?

2

Essayez d'activer OnTouchListener dans votre activité (au lieu de onClickListener) et remplacez onClick() par onTouch(). Cela a fonctionné pour moi. Les onTouchEvent de ma vue personnalisée et onTouch() de Activity sont appelés. N'oubliez pas de retourner "false" dans onTouch() et "true" dans OnTouchEvent de votre vue personnalisée.

6

Dans votre implémentation de onTouchEvent, au lieu de « return true; », faire ...

return super.onTouchEvent(event); 

Vous surchargeons la mise en œuvre de la superclasse qui est ce qui est responsable d'appeler l'auditeur. En appelant la mise en œuvre de la superclasse, elle devrait agir comme avant. C'est pourquoi votre code fonctionne lorsque vous mettez en commentaire la méthode - parce que vous ne surchargez plus l'implémentation de la superclasse

Questions connexes