it-swarm.com.de

Android - Alle angezeigten Toast-Nachrichten ausblenden

Wie entferne ich alle aktuell angezeigten Toast-Nachrichten?

In meiner App gibt es eine Liste. Wenn ein Benutzer auf ein Element klickt, wird eine Toastnachricht angezeigt. 10 Elemente - 10 Toastnachrichten.

Wenn der Benutzer also zehn Mal klickt und dann die Menütaste drückt, muss er einige Sekunden warten, bis er den Menüoptionstext lesen kann.

Es sollte nicht so sein :)

51
crazyV

Meine Lösung bestand darin, einen einzelnen Toast in der Aktivität zu initialisieren. Dann ändern Sie den Text bei jedem Klick.

Toast mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
if (a) {
  mToast.setText("This is a");
  mToast.show();
} else if (b) {
  mToast.setText("This is b");
  mToast.show();
}
78
Mudar

wie deaktiviere ich alle Toast-Nachrichten Prozess derzeit?

Sie können einzelne Toasts abbrechen, indem Sie cancel() für das Toast-Objekt aufrufen. AFAIK, es gibt jedoch keine Möglichkeit, alle ausstehenden Toasts abzubrechen.

29
CommonsWare

Wie sieht es aus, wenn bereits ein Toast angezeigt wird?

private Toast toast;
...
void showToast() {
   if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
      toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
      toast.show();
   }
}
11
Justin Muller

Die Lösung von Mudar hat für mich bei einem ähnlichen Problem wunderbar funktioniert - ich hatte verschiedene Toasts, die sich nach mehreren button-Klicks in einem Backlog stapelten.

Ein Beispiel für Toast mit unterschiedlichen setText()s und show()s war genau die Antwort, nach der ich gesucht hatte. Die vorherige Nachricht wurde abgebrochen, sobald auf eine neue Schaltfläche geklickt wurde. Spot auf 

Nur als Referenz, hier habe ich getan ...

In OnCreate:

    final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);

Innerhalb jeder OnClick:

myToast.setText(R.string.toast1);
myToast.show();
8

Meine Lösung ist es, alle Toastreferenzen in einer Liste zu speichern und eine Methode zu erstellen, um sie bei Bedarf abzubrechen:

private ArrayList<Toast> msjsToast = new ArrayList<Toast>();

private void killAllToast(){
    for(Toast t:msjsToast){
        if(t!=null) {
            t.cancel();
        }
    }
    msjsToast.clear();
}

Wenn Sie einen Toast erstellen, gehen Sie folgendermaßen vor und speichern Sie die Referenz:

Toast t = Toast.makeText(context, "Download error: xx", Toast.LENGTH_LONG);
t.show();
msjsToast.addToast(t);

Wenn Sie sie löschen müssen:

killAllToast();

Sie können dies wie eine statische Methode in einer globalen Klasse erstellen und damit den gesamten Toast der App beenden. 

4
user23

Ich glaube, ich habe einen Weg gefunden, Toast-Nachrichten nicht für mich in die Warteschlange zu stellen. Ich dachte, ich würde teilen. 

dieser Teil geht an die Spitze. 

private Toast msg;    

Dieser Teil geht in meinen setOnTouchListener ()

if(null == msg)
{
msg = Toast.makeText("Message to user!", Toast.LENGTH_SHORT);
msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
msg.show();

//handels the stupid queueing toast messages
new Handler().postDelayed(new Runnable()
{
      public void run()
      {
          msg = null;

      }
}, 2000);

}

Es ist mehr ein Hack als alles andere. Ich zeige jedoch immer eine Toast-Nachricht, wenn jemand einen Teil meiner App favorisiert. Und wenn sie verrückt werden, indem sie auf den Favoritenknopf klicken, wird sie durch die Toastmeldungen verrückt. Aber nicht mehr. Es wird 2 Sekunden warten und dann mein Toast-Objekt auf Null setzen und erneut anzeigen lassen. 

3
S.A.Jay

Hier ist meine einfache Antwort auf das Problem:

Erstellen Sie zunächst in Ihrer Aktivität ein globales Toast-Objekt.

    private Toast example;

Wann immer Sie eine neue Toast-Nachricht anrufen möchten, tun Sie dies einfach:

if(buttonClicked) {
    example.cancel();
    example = Toast.makeText(this, "" , Toast.LENGTH_SHORT);
    example.setText("Button Clicked");
    example.show();
}

Dies hält alle Toasts in einem zentralen Toast und entfernt Toast-Spam. Dies ist eine schnelle grobe Lösung, daher gibt es vielleicht einen eleganteren Weg, dies zu tun.

3
Roymunson

Erstellen Sie ein Toast-Objekt außerhalb der onClick-Funktion, und verwenden Sie den folgenden Code . Er stoppt den vorhandenen Toast und startet den neuesten Toast.

Toast mToast;

public void onClick(String abc) {

    if(mToast!=null)
        mToast.cancel();
    Context context = this;
    mToast = Toast.makeText(context, abc, Toast.LENGTH_SHORT);
    mToast.show();
}
2
Akash Gupta

So mache ich es.

Toast toast;   

if(toast==null)
        toast=Toast.makeText(getApplicationContext(),R.string.act_now_private_post_text,Toast.LENGTH_LONG);
        else
            toast.setText(R.string.act_now_private_post_text);
        toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL,10,10);
        toast.show();
1
Victor Odiah
mToast=Toast.makeText(this, "", Toast.LENGTH_LONG);
        showToast.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                mToast.cancel();
                String text=null;
                if(ON)
                {
                    text="Toast is on";
                }
                else
                {
                    text="Toast is off";
                }
                mToast.setText(text);
                mToast.setDuration(Toast.LENGTH_SHORT);
                mToast.show();

            }
        });
0
balu

Wie wäre es mit diesen!?

private Toast toast;

...
// Methods for short toast messages and long toast messages

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

    private void showLongToast(String message) {
        if(null != toast) toast.cancel();
        (toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG)).show();
    }

und bei onPause ()

@Override
    protected void onPause() {
...
if(null != toast) toast.cancel();
..
}
0
Pramod P K

In meiner App tauchten immer wieder Toasts in der Warteschlange auf, wenn die App in den Hintergrund gerät.

Fügen Sie Code hinzu, um festzustellen, wann die App in den Hintergrund wechselt. Eine Möglichkeit, den Lebenszyklus-Handler zu registrieren. Für mehr Details ref

registerActivityLifecycleCallbacks(new MyLifecycleHandler());

App.inBackground = true;, wenn die App in den Hintergrund wechselt und den Toast mithilfe der SmartToast-Klasse anzeigt

public class SmartToast {

    static ArrayList<WeakReference<Toast>> toasts = new ArrayList<>();
    public static void showToast(@NonNull Context context,@NonNull String message){
        //this will not allowed to show toast when app in background
        if(App.inBackground) return;
        Toast toast = Toast.makeText(context,message,Toast.LENGTH_SHORT);
        toasts.add(new WeakReference<>(toast));
        toast.show();

        //clean up WeakReference objects itself
        ArrayList<WeakReference<Toast>> nullToasts = new ArrayList<>();
        for (WeakReference<Toast> weakToast : toasts) {
            if(weakToast.get() == null) nullToasts.add(weakToast);
        }
        toasts.remove(nullToasts);
    }

    public static void cancelAll(){
        for (WeakReference<Toast> weakToast : toasts) {
            if(weakToast.get() != null) weakToast.get().cancel();
        }
        toasts.clear();
    }

}

rufen Sie die SmartToast.cancelAll();-Methode auf, wenn die App in den Hintergrund wechselt, um aktuelle und alle anstehenden Toasts auszublenden. Code macht Spaß. Genießen!

0
Qamar

Mit Madurs hervorragender Antwort oben erweiterte ich diese um eine Klasse, die sich mit verschiedenen Arten von Nachrichten befasste:

public class ToastManager {
    private Toast toastWarningMessage;
    private Toast toastAddMessage;
    ...

    public void messageWarning(Context context, String message) {
        if(toastWarningMessage == null) {
            toastWarningMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
        } else {
            toastWarningMessage.cancel();
            toastWarningMessage.setText(message);
        }
        toastWarningMessage.show();
    }

    public void messageAdd(Context context, String message) {
        if(toastAddMessage == null) {
            toastAddMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
        } else {
            toastAddMessage.cancel();
            toastAddMessage.setText(message);
        }
        toastAddMessage.show();
    }
    ...
}

Und dies wird aus meiner Haupttätigkeit gerufen:

ToastManager toastManager;
...
private void toastWarningMessage(String message) {
    if(toastManager == null) toastManager = new ToastManager();
    toastManager.messageWarning(this, message);
}

Der Grund für das Klassifizieren der Nachrichten besteht darin, sicherzustellen, dass keine wichtigen Nachrichten überschrieben werden. Diese Lösung scheint einfach wiederzuverwenden, da nur die Toasts und die Funktionsnamen umbenannt werden müssen. 

Wenn der Benutzer die Schaltfläche spammt, wird der Toast für den gleichen Nachrichtentyp jedes Mal abgebrochen. Das einzige Problem ist, wenn der Benutzer eine Mischung von Nachrichten spammen kann. Dies führt dazu, dass die erste Nachricht wiederholt wird und die anderen Nachrichten schließlich einmal verfallen. Nicht wirklich ein riesiges Problem, aber etwas, das man beachten sollte.

Ich habe nicht nach möglichen Nachteilen von mehreren Toast-Instanzen gesucht.

0
David

Sie können so verwenden ..

class MyToast {
private static Toast t;

public MyToast(Context ctx, String message) {
    if (t != null) {
        t.cancel();
        t = null;
    }
    t = Toast.makeText(ctx, message, Toast.LENGTH_SHORT);
}

public void show() {
    t.show();
}
}