J'ai une animation "open" et j'utilise Handler.postDelayed(Runnable, delay)
pour déclencher une animation "close" après un court délai. Cependant, pendant le temps entre l'ouverture et la fermeture, il y a peut-être une autre animation déclenchée par un clic.
Ma question est, comment pourrais-je annuler l'animation "close" dans le gestionnaire?
Utilisez simplement la méthode removeCallbacks(Runnable r)
.
La réponse de Cristian est correcte, mais contrairement à ce qui est indiqué dans les commentaires de la réponse, vous pouvez réellement supprimer les rappels pour les Runnables
anonymes en appelant removeCallbacksAndMessages(null);
Comme indiqué ici :
Supprimez tous les messages de rappel en attente et les messages envoyés dont l'obj est un jeton. Si le jeton est nul, tous les rappels et messages seront supprimés .
Il s'agit d'une réponse tardive, mais voici une méthode différente lorsque vous souhaitez uniquement supprimer une catégorie spécifique de runnables du gestionnaire (c'est-à-dire dans le cas de OP, supprimez simplement l'animation de fermeture, en laissant les autres runnables dans la file d'attente):
int firstToken = 5;
int secondToken = 6;
//r1 to r4 are all different instances or implementations of Runnable.
mHandler.postAtTime(r1, firstToken, 0);
mHandler.postAtTime(r2, firstToken, 0);
mHandler.postAtTime(r3, secondToken, 0);
mHandler.removeCallbacksAndMessages(firstToken);
mHandler.postAtTime(r4, firstToken, 0);
Le code ci-dessus exécutera "r3" puis "r4" uniquement. Cela vous permet de supprimer une catégorie spécifique de runnables définie par votre jeton, sans avoir besoin de conserver des références aux runnables elles-mêmes.
Remarque: le code source compare les jetons en utilisant l'opérande "==" uniquement (il n'appelle pas .equals ()), il est donc préférable d'utiliser des entiers/entiers au lieu de chaînes pour le jeton.
Si vous utilisez la récursivité, vous pouvez y parvenir en passant "this". Voir le code ci-dessous.
public void countDown(final int c){
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
aq.id(R.id.timer).text((c-1)+"");
if(c <= 1){
aq.id(R.id.timer).gone();
mHandler.removeCallbacks(this);
}else{
countDown(c-1);
}
}
}, 1000);
}
Cet exemple définira le texte d'un TextView (timer) toutes les secondes, en comptant à rebours. Une fois arrivé à 0, il supprimera le TextView de l'interface utilisateur et désactivera le compte à rebours. Cela n'est utile que pour quelqu'un qui utilise la récursivité, mais je suis arrivé ici à la recherche de cela, donc je publie mes résultats.
Si vous souhaitez supprimer le rappel d'un Runnable anonyme, lancez simplement: handler = null
Tout sera supprimé.