2013-09-07 17 views
6

W Androidzie, kiedy tworzę toast i pokażę, pojawiają się one kolejno. Problem polega na tym, że mam przycisk, który sprawdza niektóre pola i jeśli użytkownik wprowadzi niepoprawne dane, pojawi się toast. Jeśli użytkownik kilkakrotnie dotknie przycisku, nagromadzone są toasty, a wiadomość nie znika na kilka sekund.Najlepszy sposób na uniknięcie gromadzenia się toastów w Androidzie

Jaki jest najlepszy sposób na uniknięcie tego?

  • Czy mogę zapisać odniesienie do ostatniej Toast i usunąć przed wykonaniem nowej?
  • Czy należy używać tego samego tostu do wszystkich wiadomości?
  • Czy mogę użyć dowolnej metody, która usuwa wszystkie grzanki z aplikacji przed wykonaniem i wyświetleniem nowej?
+0

Mam ten sam problem, podzielę się z Wami kilkoma pomysłami, które nie zadziałały, czyniąc toast ostatecznym, używając również warunków, używając liczników ..: \ będę teraz oglądał to pytanie. –

+2

Hola (Hello) Didac, czy próbowałeś [this] (http://stackoverflow.com/questions/12922516/how-to-prevent-multiple-toast-overlaps) lub [that] (http://stackoverflow.com/questions/6496725/showing-multiple-toast-at-the-same-time-problem)? – AlexBcn

+0

Najlepszym sposobem jest nie używać grzanek. :) could – kcoppock

Odpowiedz

25

Możesz użyć metody cancel() z Toast, aby zamknąć przedstawienie Toast.

Użyj zmiennej, aby zachować odniesienie do każdej Toast podczas jej wyświetlania, i po prostu zadzwoń pod numer cancel() przed wyświetleniem kolejnego.

private Toast mToast = null; // <-- keep this in your Activity or even in a custom Application class 

//... show one Toast 
if (mToast != null) mToast.cancel(); 
mToast = Toast.makeText(context, text, duration); 
mToast.show(); 

//... show another Toast 
if (mToast != null) mToast.cancel(); 
mToast = Toast.makeText(context, text, duration); 
mToast.show(); 

// and so on. 

Można nawet owinąć że w małej klasie tak:

public class SingleToast { 

    private static Toast mToast; 

    public static void show(Context context, String text, int duration) { 
     if (mToast != null) mToast.cancel(); 
     mToast = Toast.makeText(context, text, duration); 
     mToast.show(); 
    } 
} 

i używać go w kodzie tak:

SingleToast.show(this, "Hello World", Toast.LENGTH_LONG); 

//

+1

Rozwiązanie "SingleToast' działa, ale ma problem z pamięcią. Zachowuje "kontekst" przez całe życie 'mToast', które może znacznie przekroczyć przyszłe życie" kontekstu ". Zamiast tego należy użyć 'context.getApplicationContext()', aby uniknąć wycieku pamięci. –

1

mieć tylko Jedna toast w tym działaniu.

private Toast toast = null; 

Wtedy po prostu sprawdzić, czy istnieje obecnie Toast są pokazane przed utworzeniem kolejnego.

if (toast == null || !toast.getView().isShown()) { 
    if (toast != null) { 
     toast.cancel(); 
    } 
    toast = Toast.makeToast("Your text", Toast.LENGTH).show(); 
} 

Można nawet zrobić ten ostatni fragment do prywatnej metody showToast(text) byłaby kod, jeśli chcesz wyświetlać różne komunikaty tekstowe.

Powiązane problemy