web-dev-qa-db-fra.com

Terminer l'activité après la disparition du message de pain grillé?

Est-ce que quelqu'un sait s'il y a une possibilité de faire quelque chose (dans mon cas l'activité de finition) sur le message de pain grillé sera fermé?

25
Tima

Vous faites cela simplement en créant une Thread qui dure tant que la Toast est affichée et vous pouvez ensuite terminer votre Activity.

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            // your other stuff
            Toast.makeText(this,"This is a Toast", Toast.LENGTH_LONG).show();
            thread.start();
}

Créez maintenant un thread qui attend (LENGTH_LONG = 3.5) ou (LENGTH_SHORT = 2) secondes

    Thread thread = new Thread(){
             @Override
            public void run() {
                 try {
                    Thread.sleep(Toast.LENGTH_LONG); // As I am using LENGTH_LONG in Toast
                    Your_Activity.this.finish();
                } catch (Exception e) {
                    e.printStackTrace();
                }
             }  
           };
44
Lalit Poptani

Il devrait d'abord afficher Toast puis après 2 secondes, il finira votre activity.

Toast.makeText(YourActivity.this, "MESSAGE", Toast.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        YourActivity.this.finish();
    }
}, 2000);
14
Julio Betta

Android.widget.Toast n'offre pas d'auditeurs pour informer quand il est fini.

Vous pouvez appeler Toast.getDuration () pour connaître sa durée et créer votre propre tâche TimerTask au moment où Toast disparaît pour y effectuer vos tâches.

9
Pointer Null

Oui, mais c'est une astuce

Android Toast ne dispose pas d'un moyen de définir un rappel une fois l'opération terminée.

Donc, ce que vous pouvez faire est basé sur ce fait

private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds

maintenant tu peux faire:

  1. Mettre en place le pain grillé 
  2. Configurez un thread de compteur basé sur LENGTH_LONG (3.5s) ou LENGTH_SHORT (2s) pour fermer l'activité. 
  3. toast.show () et thread.start ();
7
Terence Lui

Voici comment je le fais ... 

Notez que cette classe inclut un appel pour fermer l'activité qui l'a appelée. Vous pouvez le retirer si nécessaire.

Notez également que les heures de sommeil suivent la durée du toast, mais que j'ai ajouté une demi-seconde supplémentaire pour donner un peu de marge avant la fin de l'activité.

public class Toaster implements Runnable
{
Context         theContext;
CharSequence    theMessage;
int             theDuration;
Activity        theActivity;

public Toaster( Activity a, Context c, CharSequence s, int i )
{
    theActivity = a;
    theContext = c;
    theMessage = s;
    theDuration = i;
}

@Override
public void run() 
{
    Toast toast = Toast.makeText(theContext, theMessage, theDuration );
    toast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL, 0, 0);
    toast.show();   

    Thread t = new Thread( new Runnable()
    {
        @Override
        public void run()
        {
            try 
            {
                Thread.sleep(theDuration == Toast.LENGTH_SHORT ? 2500 : 4000);
            }
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }

            theActivity.finish();
        }

    });
    t.start();
}
}

Dans l'activité, il y a un morceau de code qui ressemble à ceci:

    Context c = getApplicationContext();
    CharSequence msg = "Form Data Submitted!";
    int duration = Toast.LENGTH_SHORT;

    runOnUiThread( new Toaster(this, c, msg, duration) );
3
Mike Fulton

En fait, il n'y a pas de callback quand une Toast est terminée, mais si vous avez besoin de savoir quand elle sera fermée, vous pouvez démarrer un thread d'arrière-plan qui dormira un nombre de millisecondes égal à la durée Toast et ensuite exécuter l'opération . Ceci est juste une façon de résoudre le problème, je suis sûr qu'il y a plus de solutions. J'espère que cela t'aides.

2
Egor

Je ne suis pas sûr de votre cas d'utilisation, mais avez-vous vraiment besoin d'attendre la fin du toast pour terminer votre activité? 

Dans mon cas, j'ai une activité qui est un point d'entrée dans l'application à partir d'une URL (permettant à l'application d'être ouverte à partir d'un lien situé dans un courrier électronique ou sur une page Web). Si l'URL ne réussit pas un contrôle de validation, je montre un toast et termine l'activité:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ...

    if (!validateUrl()) {
        Toast.makeText(this, R.string.invalid_url, Toast.LENGTH_LONG).show();
        finish();
        return;
    }
    ...
 }

Cela montre le pain grillé et je n'ai pas à attendre jusqu'à ce qu'il ne soit plus affiché avant d'appeler finish (). Au début, je pensais que cela ne fonctionnait pas, mais j'ai ensuite découvert que c'était parce que j'avais oublié d'appeler show () sur le pain grillé!

1
Vicki

Je ne suis pas sûr que vous puissiez le faire avec Toasts. Toutefois, vous pouvez remplacer le pain grillé par un simple dialogue (et réutiliser le design de Toast si vous le souhaitez), puis utiliser des méthodes telles que onDetachedFromWindow fermeture de l'activité à la fenêtre.

1
Sephy

Je viens de créer une simple bibliothèque pour ce "problème" Télécharger:

https://github.com/mkiisoft/Toaster

et l'utiliser de cette façon:

Toaster.getInstance().makeText(context, "your custom message", Toast.LENGTH_SHORT, new OnToasterFinish() {
                @Override
                public void finish() {
                    // Your code over here after the Toast
                }
            });
1
Mariano Zorrilla

Étendez la classe Toast et utilisez votre propre rappel.

0
Thommy

En revanche, l’API INotificationManager (utilisée sous le capot de la classe toast) ne prend pas en charge la notification à l’appelant lors de la fermeture de Toast. 

Il n’existe également aucun moyen de vérifier si Toast est affiché ou masqué sans utiliser la réflexion pour choisir la classe interne qui représente la notification transitoire.

0
Jens

Vous appelez le toast, puis utilisez Onstop (). Votre toast va maintenant apparaître. 

0
Thiru