2010-05-02 9 views
47

Jak usunąć wszystkie obecnie wyświetlane komunikaty toastowe?Android - Ukryj wszystkie pokazywane komunikaty Toast

W mojej aplikacji istnieje lista, kiedy użytkownik klika element, wyświetlany jest komunikat toastowy, 10 elementów - 10 wiadomości tostowych.

Jeśli użytkownik kliknie 10 razy, a następnie naciśnie przycisk menu, musi poczekać kilka sekund, aż będzie mógł odczytać tekst opcji menu.

Nie powinno być tak :)

+0

Możliwy duplikat [Anuluj tosty przy wyjściu z aplikacji i wyświetlaniu toastu] (http://stackoverflow.com/questions/16098151/android-cancel-toast-when-exiting-the-app-and- kiedy-toast-jest-pokazywany) –

Odpowiedz

29

jak mogę wyłączyć wszystkie wiadomości tosty będący obecnie proces?

można anulować indywidualny Toasts wywołując cancel() na obiekcie Toast. AFAIK, nie ma możliwości, aby anulować wszystkie zaległe Toasts, jednak.

+0

hmm, wielkie dzięki, spróbuję coś stworzyć. ale jeśli dodaję wszystkie wiadomości toastowe do jakiejś struktury ... czy istnieje możliwość sprawdzenia, które z nich zostały wyświetlone, a które nie. Jestem trochę zajęty tymczasem ... usiłuję zapytać i nie spróbować, przynajmniej odpowiem próbując zbudować coś (najpóźniej) pod koniec tygodnia. -sowy! - – crazyV

+8

To jest mój najnowszy zwierzak dla Androida: nie ma możliwości anulowania wszystkich oczekujących w kolejce toastów. –

+2

Co za rozczarowanie: jeśli anulujesz bieżące tosty, kolejne toasty będą wyświetlane dopiero po upływie czasu, jaki ma zamiar pokazać toast. –

76

Moim rozwiązaniem było zainicjowanie pojedynczej tosty w działaniu. Następnie zmieniając tekst przy każdym kliknięciu.

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(); 
} 
+2

dzięki za odpowiedź, CommonsWare powyżej już wyjaśniono, aby wyłączyć listę oczekujących wiadomości toast ... :) thx, ale sry .. Myślę, że źle zrozumiałeś pytanie! – cV2

+2

Chociaż jest to dobra odpowiedź, w rzeczywistości nie jest to samo zachowanie. Dzięki temu rozwiązaniu nigdy nie będziesz mieć dwóch tostów, które się po sobie pokazują. –

7

rozwiązanie Mudar pracował pięknie mi na podobny problem - miałem różne toasty układania się w portfelu po wielu button kliknięć.

Jedno wystąpienie Toast z różnymi setText()s i show() s było dokładnie tą odpowiedzią, której szukałem - poprzednia wiadomość została anulowana zaraz po kliknięciu nowego przycisku. Spot na

tylko dla odniesienia, oto co zrobiłem ...

W OnCreate:

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

ciągu w każdej OnClick:

myToast.setText(R.string.toast1); 
myToast.show(); 
+1

Utrwalam to po prostu dlatego, że uważam, że nie dodaje nic nowego. To mógł być komentarz do odpowiedzi Mudara. –

0
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

Jest to w zasadzie takie samo, jak odpowiedź Mudara. –

-10

Oto jak wyłączyć toast wiadomości, usuń wyrażenie show().

//Disable notification message 
Toast.makeText(this,"Message",Toast.LENGTH_SHORT); 

//Enable notification message 
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show(); 
+1

To ich nie blokuje, po prostu nigdy ich nie pokazuje. To nie to samo! –

+1

To zabawne, ale – Machado

3

Myślę, że znalazłem sposób, aby wiadomość tosty nie była kolejkowa dla mnie. Myślałem, że się podzielę.

ta część jest na górze.

private Toast msg;  

Ta część idzie w moim 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); 

} 

to bardziej hack niż cokolwiek. Ale pokazuję wiadomość z tostem za każdym razem, gdy ktoś lubi część mojej aplikacji. A jeśli oszaleją, klikając na ulubiony przycisk, zwariuje z wiadomościami toastów. Ale już nie. Będzie czekać 2 sekundy, a następnie ustawi mój obiekt toastu na wartość null i umożliwi ponowne wyświetlenie.

+1

Rozwiązanie Handler.postDelayed jest interesujące, +1 za to. –

10

Co powiesz na sprawdzenie, czy toast jest już wyświetlany?

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

To działało najlepiej dla mnie, ponieważ miałem parę suwaków, z których każdy mógł wygenerować kilka grzanek na sekundę, gdy użytkownik brał z nimi udział. Upvoting z podziękowaniami za Twój wkład. – pete

1

Tak to robię.

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(); 
0

można używać tak ..

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(); 
} 
} 
+2

Witaj w SO & Thanks for sharing. Spróbuj dodać opisowy tekst do odpowiedzi tylko na kod. ["Jak napisać dobrą odpowiedź?"] (Http://stackoverflow.com/help/how-to-answer). _Brawność jest akceptowalna, ale pełniejsze wyjaśnienia są lepsze. –

0

Korzystanie doskonałą odpowiedź Madur za wyżej, ja przedłużony to do klasy, która zajmie się różnych typów wiadomości:

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(); 
    } 
    ... 
} 

I jest to wywoływane z mojej głównej działalności:

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

Powodem klasyfikacji wiadomości jest upewnienie się, że żadne ważne wiadomości nie są nadpisywane. To rozwiązanie wydaje się łatwe do ponownego wykorzystania, ponieważ obejmuje tylko zmianę nazwy toastów i nazw funkcji.

Gdy użytkownik naciska przycisk, toast za każdym razem jest automatycznie anulowany dla tego samego typu wiadomości. Jedyny problem polega na tym, że użytkownik może wysyłać wiadomości zawierające mieszankę wiadomości. Prowadzi to do tego, że pierwsza wiadomość powtarza się, a kiedy w końcu wygaśnie, inne wiadomości zostaną wyświetlone po każdym z nich. Naprawdę nie jest to ogromny problem, ale coś, o czym należy pamiętać.

Nie rozważałem możliwych minusów posiadania wielu instancji Toast.

3

Moje rozwiązaniem jest zapisanie wszystkich odniesień tosty z listy i dokonać metody, aby anulować wszystkie je, gdy jest to potrzebne:

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

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

Podczas tworzenia Toast zrobić w ten sposób i zapisać odwołanie:

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

Gdy trzeba usunąć je:

killAllToast(); 

można utworzyć to jak statyczny Metoda w klasie globalnej i użyj jej, aby zabić wszystkie tosty aplikacji.

1

Oto moja prosta odpowiedź na pytanie:

pierwsze w swojej działalności stworzenia globalnego Toast obiekt.

private Toast example; 

Teraz, gdy chcesz wywołać nową wiadomość Toast po prostu to zrobić:

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

ten zachowuje wszystkie grzanki w jednym centralnym Toast Toast i usuwa spam. Jest to szybkie, zgrubne rozwiązanie, więc być może jest to bardziej elegancki sposób.

0

W mojej aplikacji, kolejka tostów pojawia się ponownie i ponownie, gdy aplikacja przechodzi w tło, więc podążałem za nią, aby rozwiązać problem.

Dodaj kod, aby wykryć, kiedy aplikacja przechodzi w tło. Jednym ze sposobów zarejestrowania programu obsługi cyklu życia.Aby uzyskać więcej szczegółów ref

registerActivityLifecycleCallbacks(new MyLifecycleHandler()); 

App.inBackground = true; gdy aplikacja przechodzi do tła i pokazać tosty za pomocą klasy SmartToast

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(); 
    } 

} 

połączenia SmartToast.cancelAll(); metoda gdy aplikacja przechodzi w tle, aby ukryć wszystkie oczekujące bieżące i toasty. Kod jest fajny. Cieszyć się!