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é?
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();
}
}
};
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);
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.
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:
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) );
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.
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é!
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.
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
}
});
Étendez la classe Toast et utilisez votre propre rappel.
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.
Vous appelez le toast, puis utilisez Onstop (). Votre toast va maintenant apparaître.