2011-09-12 2 views
8

J'ai une vue personnalisée qui agit comme un bouton. Je veux changer l'arrière-plan lorsque l'utilisateur appuie dessus, rétablir l'arrière-plan à l'original lorsque l'utilisateur déplace le doigt à l'extérieur ou le libérer et je veux également gérer les événements onClick/onLongClick. Le problème est que onTouch me demande de retourner vrai pour ACTION_DOWN ou il ne m'enverra pas l'événement ACTION_UP. Mais si je reviens vrai l'écouteur onClick ne fonctionnera pas.Android onTouch avec onClick et onLongClick

Je pensais que je l'ai résolu en retournant false dans onTouch et en enregistrant onClick - cela a fonctionné d'une manière ou d'une autre, mais était plutôt contre les docs. Je viens de recevoir un message d'un utilisateur me disant qu'il ne peut pas cliquer longtemps sur le bouton, alors je me demande ce qui ne va pas ici.

Une partie du code actuel:

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

Comment puis-je faire travailler ensemble correctement?

Merci à l'avance

Répondre

10

onClick & onLongClick est effectivement expédié à partir View.onTouchEvent.

si vous remplacez View.onTouchEvent ou de définir une View.OnTouchListener spécifique via setOnTouchListener, vous devez prendre soin de cela.

de sorte que votre code doit être quelque chose comme:

 
public boolean onTouch(View v, MotionEvent evt) 
{ 
    // to dispatch click/long click event, 
    // you must pass the event to it's default callback View.onTouchEvent 
    boolean defaultResult = v.onTouchEvent(evt); 

    switch (evt.getAction()) 
    { 
    case MotionEvent.ACTION_DOWN: 
    { 
     setSelection(true); // just changing the background 
     break; 
    } 
    case MotionEvent.ACTION_CANCEL: 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_OUTSIDE: 
    { 
     setSelection(false); // just changing the background 
     break; 
    } 
    default: 
     return defaultResult; 
    } 

    // if you reach here, you have consumed the event 
    return true; 
} 
Questions connexes