2010-12-09 3 views
22

J'ai développé une application android et je suis confronté à un problème avec Toast. Supposons que j'affiche un Toast, il s'affiche dans la fenêtre de l'application. Lorsqu'une boîte de dialogue apparaît, le toast ne disparaît pas instantanément.Comment annuler Toast

Je veux savoir comment je peux annuler le toast.

+0

Sauvegarde ce @EboMike [a dit dans sa réponse] (http://stackoverflow.com/a/4395089/383414), je l'ai eu du succès avec mon 'essentiel Boast.java' pour la dernière quelques années - [Boast.java sur Github] (https://gist.github.com/mobiRic/9786993) –

Répondre

41

Toast.makeText renvoie un objet Toast. Appelez cancel() sur cet objet pour l'annuler.

+1

Merci mon chéri, Kariyachan – DroidBot

+1

Pas de problème! Bonne chance avec votre application! – EboMike

+0

@EboMike Comment cela peut-il être réalisé? Pouvez-vous l'élaborer s'il vous plaît? Je suis nouveau dans le développement. –

5

La durée la plus courte que vous pouvez spécifier pour le toast est Toast.LENGTH_SHORT, qui a une valeur de 0 mais est en réalité 2000 milliseconds long. Si vous voulez plus courte que cela, essayez ceci:

final Toast toast = Toast.makeText(ctx, "This message will disappear in 1 second", Toast.LENGTH_SHORT); 
    toast.show(); 

    Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       toast.cancel(); 
      } 
    }, 1000); //specify delay here that is shorter than Toast.LENGTH_SHORT 
+0

Il semble fonctionner très bien sur Android 4.1, mais pas sur la version 2.2. : -/ – Komi

0

Utilisez la méthode annuler de Tost: toast.cancel();

4

Je pense qu'il n'est pas nécessaire de créer un toast personnalisé.

Créer une instance unique de la classe Toast. Nous venons de définir le texte du toast en utilisant toast.setText("string"), et appelez la méthode toast.cancel() dans la méthode onDestroy().

extrait de code de travail comme suit:

package co.toast; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class ShowToastActivity extends Activity { 
    private Toast toast = null; 
    Button btnShowToast; 

    @SuppressLint("ShowToast") 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // creates only one toast object.. 
     toast = Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG); 

     btnShowToast = (Button) findViewById(R.id.btnShowToast); 

     btnShowToast.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       // only set text to toast object.. 
       toast.setText("My toast!"); 
       toast.show(); 
      } 
     }); 
    } 

    @Override 
    protected void onDestroy() 
    { 
     toast.cancel(); 
     super.onDestroy(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     toast.cancel(); 
    } 
} 

Espérons que cela est utile pour vous ..

+0

Hey .. Cela a fonctionné .. Merci –

0

Ceci est un exemple de base en utilisant la méthode cancel() d'un Toast.

Toast mytoast; 
mytoast = Toast.makeText(getApplicationContext(), "Hi Ho Jorgesys! ", Toast.LENGTH_LONG); 
mytoast.show(); 
.... 
.... 
.... 
if(CancelToast){ 
    mytoast.cancel(); 
} 
-1

Ok, je suis trop en train d'annuler un Toast, et ne peut pas sembler obtenir l'annuler() pour obtenir invoqué soit dans le Activity.onDestroy() ou Activity.onStop() Après quelques lectures API-doc et googling des autres ayant besoin d'aide pour obtenir Toasts à annuler, Je pense que je ne suis toujours pas clair sur quand les activités sont arrêtées, mis en pause, détruit. J'ai besoin d'un moyen sûr de forcer mon activité à être mis en pause ou arrêté.

Dans mon cas particulier, car il n'y a que de courtes et longues Toasts durée, j'ai décidé de itérer une boucle 5 fois faire un spectacle() d'un toast longue durée, il resterait à l'écran pour 15-20 secondes. Cela fonctionne bien!

Mais, l'inconvénient (effet secondaire négatif) d'utiliser un objet Toast est qu'ils persistent même après que l'utilisateur abandonne votre application et retourne à l'écran d'accueil et commence à utiliser une autre application ... votre toast va vivre pendant les 15-20 prochaines secondes, à moins que vous pouvez garantir que vous pouvez trouver un endroit (d'une certaine manière) à invoquer cancel(). En outre, vous devez croire que Android honorera votre appel pour annuler()!

Donc, à cette fin, j'ai peaufinage ma simple boucle, en essayant de Invoke annule droite dans la boucle, et me prouver qu'il honorer un appel annuler, et se comporter visuellement comme prévu.

Extrait de code: Note: « toasts » est une variable publique INSTANCE, donc nous avoir une seule instance du Toast-objet [comme est recommandé ci-dessus, et qu'un intervenant a confirmé travaillait il y a deux ans, dans l'activité onStop() et OnDestroy()]

toast = Toast.makeText(ctxt, result, Toast.LENGTH_LONG); 
    for (int i=0; i < 5; i++) 
    { 
     // Long-toasts each last about 3.5 secs 
     toast.show(); 

     android.os.SystemClock.sleep(1500); 
     toast.cancel(); 
     android.os.SystemClock.sleep(1500); 
     toast = Toast.makeText(ctxt, result, Toast.LENGTH_LONG); 
    } 

Ok, la boucle originale contenait cette seule ligne faire le spectacle. Cela fonctionne, par lui-même.

Mais d'expérimenter, j'ai ajouté ces quatre lignes, dormir environ à mi-chemin à travers les 3,5 secondes montrant, puis l'annuler, rendormir pour une seconde et demie, puis re-créer et montrer la Toast à nouveau.

Je pensais voir le pain grillé pendant environ 1,5 secondes, puis le voir disparaître, et revenir dans un autre 1,5 secondes, etc.

Devinez quoi ... le pain grillé semble jamais tout!

Ok, je suis en mumble mode ... tout ce que je manque, dans comprendre les mystères intérieurs-de la façon dont la Toast classe est mis en œuvre et est censé se comporter?

Et, à mon premier numéro: Comment faire pour que mon activité se mette en veille ou s'arrête?

[Note: Je lis ce forum BEAUCOUP ... c'est génial !!! Ceci est ma première publication dans le milieu d'une discussion de fil ... Désolé que ma réponse obtienne marqué comme RÉPONSE, plutôt que comme une question concernant au sujet de ce fil. ]

+0

Si vous avez une question, s'il vous plaît poster un ... [question] (http://stackoverflow.com/questions/ask) :-) Note: c'est _not_ a forum, ce qui implique qu'il n'y a pas de discussions! Vous êtes censé soit poster des questions ou des réponses (ou des commentaires pour essayer de clarifier) ​​ – kleopatra

+0

Ok, pour répondre à mon propre commentaire: J'ai décidé de ne pas utiliser Toast, surtout dans une boucle pour allonger la durée. La solution pour moi était de laisser tomber Toast, et d'implémenter mon propre sosie en utilisant juste un TextView. De cette façon, la sortie ne traîne pas après l'achèvement de l'activité de l'application. – Dave

0
Toast toast; 

private void showToast(String text) { 
    if (toast!=null) 
     toast.cancel(); 
    toast = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
    toast.show(); 
}