web-dev-qa-db-fra.com

Puis-je annuler un Toast précédent lorsque je souhaite montrer un autre Toast?

Dans mon application, je construis un widget de calendrier pour mon activité. Lorsque je le fais défiler au mois précédent ou suivant, je le laisse faire un toast et le montre.

La question est, le pain grillé a besoin de temps pour montrer, quand je le fais défiler assez rapidement, par exemple, j'ai défilé jusqu'à "2012/05" et "2012/06" et faites défiler jusqu'à "2012/07" sans pause, je dois attendre le Toast de "2012/05", "2012/06", "2012/07" à afficher un à un lentement.

On dirait que Android a une file d'attente invisible pour gérer les toasts

comment puis-je le nettoyer et ne montrer que le dernier pain grillé? Puis-je montrer un Toast spécifique immédiatement sans attendre?  

J'ai cherché le "Android.widget.Toast.Java" et trouvé une méthode cancel(), mais malheureusement cela ne fonctionne pas comme suit.

if (t != null) {
    t.cancel();
}
t = Toast.makeText(this.mContext, mHelper.getYear() + "年"
                + (mHelper.getMonth() + 1) + "月", Toast.LENGTH_SHORT);
t.show();
28
topxebec

Vous devez appeler la méthode sur le bon objet.

toastObject.cancel()
12
Azhar Shaikh

Voici ma réponse copiée d'une autre question similaire ici:

La classe Boast accomplit exactement ce dont vous avez besoin. Le code le plus récent peut être trouvé sur GitHub ici:


L'astuce consiste à garder une trace de la dernière Toast affichée et à l'annuler.

Ce que j'ai fait est de créer un wrapper Toast, qui contient une référence statique au dernier Toast affiché.

Lorsque j'ai besoin d'en afficher un nouveau, j'annule d'abord la référence statique avant d'afficher le nouveau (et de le sauvegarder dans la statique).

Voici le code complet de l’emballage Boast que j’ai créé - il reproduit assez des méthodes Toast pour que je puisse l’utiliser. Par défaut, la Boast annulera la précédente, vous ne créerez donc pas de file d'attente de toasts en attente d'affichage.

Si vous souhaitez simplement savoir comment annuler les notifications lorsque vous quittez votre application, vous y trouverez une aide précieuse.


package mobi.glowworm.lib.ui.widget;

import Android.annotation.SuppressLint;
import Android.content.Context;
import Android.content.res.Resources;
import Android.support.annotation.Nullable;
import Android.widget.Toast;

import Java.lang.ref.WeakReference;

/**
 * {@link Toast} decorator allowing for easy cancellation of notifications. Use this class if you
 * want subsequent Toast notifications to overwrite current ones. </p>
 * <p/>
 * By default, a current {@link Boast} notification will be cancelled by a subsequent notification.
 * This default behaviour can be changed by calling certain methods like {@link #show(boolean)}.
 */
public class Boast {
    /**
     * Keeps track of certain Boast notifications that may need to be cancelled. This functionality
     * is only offered by some of the methods in this class.
     * <p>
     * Uses a {@link WeakReference} to avoid leaking the activity context used to show the original {@link Toast}.
     */
    @Nullable
    private volatile static WeakReference<Boast> weakBoast = null;

    @Nullable
    private static Boast getGlobalBoast() {
        if (weakBoast == null) {
            return null;
        }

        return weakBoast.get();
    }

    private static void setGlobalBoast(@Nullable Boast globalBoast) {
        Boast.weakBoast = new WeakReference<>(globalBoast);
    }


    // ////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * Internal reference to the {@link Toast} object that will be displayed.
     */
    private Toast internalToast;

    // ////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * Private constructor creates a new {@link Boast} from a given {@link Toast}.
     *
     * @throws NullPointerException if the parameter is <code>null</code>.
     */
    private Boast(Toast toast) {
        // null check
        if (toast == null) {
            throw new NullPointerException("Boast.Boast(Toast) requires a non-null parameter.");
        }

        internalToast = toast;
    }

    // ////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * Make a standard {@link Boast} that just contains a text view.
     *
     * @param context  The context to use. Usually your {@link Android.app.Application} or
     *                 {@link Android.app.Activity} object.
     * @param text     The text to show. Can be formatted text.
     * @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or
     *                 {@link Toast#LENGTH_LONG}
     */
    @SuppressLint("ShowToast")
    public static Boast makeText(Context context, CharSequence text, int duration) {
        return new Boast(Toast.makeText(context, text, duration));
    }

    /**
     * Make a standard {@link Boast} that just contains a text view with the text from a resource.
     *
     * @param context  The context to use. Usually your {@link Android.app.Application} or
     *                 {@link Android.app.Activity} object.
     * @param resId    The resource id of the string resource to use. Can be formatted text.
     * @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or
     *                 {@link Toast#LENGTH_LONG}
     * @throws Resources.NotFoundException if the resource can't be found.
     */
    @SuppressLint("ShowToast")
    public static Boast makeText(Context context, int resId, int duration)
            throws Resources.NotFoundException {
        return new Boast(Toast.makeText(context, resId, duration));
    }

    /**
     * Make a standard {@link Boast} that just contains a text view. Duration defaults to
     * {@link Toast#LENGTH_SHORT}.
     *
     * @param context The context to use. Usually your {@link Android.app.Application} or
     *                {@link Android.app.Activity} object.
     * @param text    The text to show. Can be formatted text.
     */
    @SuppressLint("ShowToast")
    public static Boast makeText(Context context, CharSequence text) {
        return new Boast(Toast.makeText(context, text, Toast.LENGTH_SHORT));
    }

    /**
     * Make a standard {@link Boast} that just contains a text view with the text from a resource.
     * Duration defaults to {@link Toast#LENGTH_SHORT}.
     *
     * @param context The context to use. Usually your {@link Android.app.Application} or
     *                {@link Android.app.Activity} object.
     * @param resId   The resource id of the string resource to use. Can be formatted text.
     * @throws Resources.NotFoundException if the resource can't be found.
     */
    @SuppressLint("ShowToast")
    public static Boast makeText(Context context, int resId) throws Resources.NotFoundException {
        return new Boast(Toast.makeText(context, resId, Toast.LENGTH_SHORT));
    }

    // ////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * Show a standard {@link Boast} that just contains a text view.
     *
     * @param context  The context to use. Usually your {@link Android.app.Application} or
     *                 {@link Android.app.Activity} object.
     * @param text     The text to show. Can be formatted text.
     * @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or
     *                 {@link Toast#LENGTH_LONG}
     */
    public static void showText(Context context, CharSequence text, int duration) {
        Boast.makeText(context, text, duration).show();
    }

    /**
     * Show a standard {@link Boast} that just contains a text view with the text from a resource.
     *
     * @param context  The context to use. Usually your {@link Android.app.Application} or
     *                 {@link Android.app.Activity} object.
     * @param resId    The resource id of the string resource to use. Can be formatted text.
     * @param duration How long to display the message. Either {@link Toast#LENGTH_SHORT} or
     *                 {@link Toast#LENGTH_LONG}
     * @throws Resources.NotFoundException if the resource can't be found.
     */
    public static void showText(Context context, int resId, int duration)
            throws Resources.NotFoundException {
        Boast.makeText(context, resId, duration).show();
    }

    /**
     * Show a standard {@link Boast} that just contains a text view. Duration defaults to
     * {@link Toast#LENGTH_SHORT}.
     *
     * @param context The context to use. Usually your {@link Android.app.Application} or
     *                {@link Android.app.Activity} object.
     * @param text    The text to show. Can be formatted text.
     */
    public static void showText(Context context, CharSequence text) {
        Boast.makeText(context, text, Toast.LENGTH_SHORT).show();
    }

    /**
     * Show a standard {@link Boast} that just contains a text view with the text from a resource.
     * Duration defaults to {@link Toast#LENGTH_SHORT}.
     *
     * @param context The context to use. Usually your {@link Android.app.Application} or
     *                {@link Android.app.Activity} object.
     * @param resId   The resource id of the string resource to use. Can be formatted text.
     * @throws Resources.NotFoundException if the resource can't be found.
     */
    public static void showText(Context context, int resId) throws Resources.NotFoundException {
        Boast.makeText(context, resId, Toast.LENGTH_SHORT).show();
    }

    // ////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * Close the view if it's showing, or don't show it if it isn't showing yet. You do not normally
     * have to call this. Normally view will disappear on its own after the appropriate duration.
     */
    public void cancel() {
        internalToast.cancel();
    }

    /**
     * Show the view for the specified duration. By default, this method cancels any current
     * notification to immediately display the new one. For conventional {@link Toast#show()}
     * queueing behaviour, use method {@link #show(boolean)}.
     *
     * @see #show(boolean)
     */
    public void show() {
        show(true);
    }

    /**
     * Show the view for the specified duration. This method can be used to cancel the current
     * notification, or to queue up notifications.
     *
     * @param cancelCurrent <code>true</code> to cancel any current notification and replace it with this new
     *                      one
     * @see #show()
     */
    public void show(boolean cancelCurrent) {
        // cancel current
        if (cancelCurrent) {
            final Boast cachedGlobalBoast = getGlobalBoast();
            if ((cachedGlobalBoast != null)) {
                cachedGlobalBoast.cancel();
            }
        }

        // save an instance of this current notification
        setGlobalBoast(this);

        internalToast.show();
    }

}
22

Vous avez juste besoin de déclarer un "Toast" var comme ceci:

Toast toastMessage;

Ensuite, dans votre fonction, procédez comme suit:

if (toastMessage!= null) {
    toastMessage.cancel();
}
toastMessage= Toast.makeText(context, "The message you want to display", duration);
toastMessage.show();
15
JCarangoH

Voici le code.

final Toast toastobject = Toast.makeText(context, "This message will disappear when toast.close(); is called", Toast.LENGTH_SHORT);

Maintenant, vous pouvez utiliser l'objet de toastobject. Son Référence

toastobject.cancel();

Vous pouvez l'utiliser dans le fil ou chaque fois que vous souhaitez fermer le pain grillé.

5
Bhavin

Vous pouvez réutiliser un pain grillé, cela le fera afficher immédiatement.

myToast.setText(toastMsg);
myToast.show();
4
user3533716

Il existe plusieurs façons d'annuler le précédent Toast lorsque nous voulons montrer un autre Toast. ci-dessous, j’ai écrit le moyen le plus simple de le mettre en œuvre. Tout d’abord, nous devons créer une variable accessible dans toute la classe.

private Toast toast;

Après avoir créé la variable accessible par toute la classe, nous devons créer une méthode dans notre classe qui affiche le message toast et vérifie si le toast précédent est affiché puis annule-le.

   public void showToast(String message) {
    if (toast != null) {
        toast.cancel();
    }
    toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT);
    toast.show();
}

vous pouvez modifier le message toast en appelant la méthode ci-dessus.

showToast("message 1");

//après quelque temps 

showToast("message 2");

j'espère que ça aide.

3
Gaurang Goda

Simple. Appelez simplement la méthode .cancel () sur le pain grillé une fois que vous voulez créer un autre pain grillé. 

Commencez par définir une variable Toast en haut de votre classe comme ceci 

private Toast mToast;

Plus tard, lorsque vous souhaitez créer un nouveau pain grillé (et que l’ancien disparaisse), faites-le.

if(mToast != null) {
  mToast.cancel();  //if a toast exists it deletes it, allowing you to create a new one
}


mToast = Toast.makeText(this, "This will show up now!", Toast.LENGTH_LONG);
mToast.show(); //creates the new toast. 
1
Sreehari R

Vous pouvez créer une méthode statique et l'utiliser pour montrer un toast:

public static Toast toast = null;
public static showToast(Context context,String msg){
if(toast!=null)             //this will cancel the toast on the screen if one exists
   toast.cancel();
toast = Toast.makeText(context,msg);
toast.show();
}
1
tun

Toast a une méthode pour masquer le message toast actuel

public void cancel() {
    mTN.hide();
}

Essayez d'appeler t.cancel () quand c'est nécessaire.

1
JonA
public static Toast  sToast=null;

// create Toast object;

public void showToast(String msg)

    {

    //here is checking whether toast object is null or not;if not null gonna cancel the toast that is showing in phone window and make it null;  

    if(sToast!=null)
    {

      sToast.cancel;

    sToast=null;
    }

    //if toast object is null,gonna create new instance and make it shown on phone window.

    if(sToast==null)
    {

        sToast=Toast.makeText(currentActivity.this,msg,Duration);

        sToast.setGravity();

        sToast.show();

    }

}
0
hamsayogam