2013-09-07 4 views
6

В Android, когда я создаю Toast и показываю их, они появляются последовательно. Проблема в том, что у меня есть кнопка, которая проверяет некоторые поля, и если пользователь вводит неверные данные, отображается тост. Если пользователь несколько раз прикасается к кнопке, тосты накапливаются, и сообщение не исчезает на пару секунд.Лучший способ избежать накопления тостов в Android

Каков наилучший способ избежать этого?

  • Могу ли я сохранить ссылку на последний тост и удалить его перед тем, как сделать новый?
  • Должен ли я использовать тот же Toast для всех сообщений?
  • Могу ли я использовать любой метод, который очищает все приложения Toasts до создания и отображения нового?
+0

У меня такая же проблема, я поделился с вами несколькими идеями, которые не сработали, сделав тосты окончательными, используя условия, также используя счетчики ..: \ i буду смотреть этот вопрос сейчас. –

+2

Hola (Hello) Didac, вы попробовали [это] (http://stackoverflow.com/questions/12922516/how-to-prevent-multiple-toast-overlaps) или [это] (http://stackoverflow.com/questions/6496725/show-multiple-toast-at-the-same-time-problem)? – AlexBcn

+0

Лучший способ - не использовать Тосты. :) может – kcoppock

ответ

25

Метод Toast предназначен для закрытия выставки Toast.

Используйте переменную, чтобы сохранить ссылку на каждый тост, пока вы ее показываете, и просто позвоните cancel(), прежде чем показывать еще один.

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. 

Вы можете даже обернуть это в небольшой класс, как так:

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

и использовать его в коде следующим образом:

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

//

+1

Решение «SingleToast» работает, но у него есть проблема с памятью. Он сохраняет «контекст» для времени жизни «mToast», который может превышать потенциальное время жизни «контекста». Вместо этого следует использовать 'context.getApplicationContext()', чтобы избежать утечки памяти. –

1

Есть только один тост в этой деятельности.

private Toast toast = null; 

Тогда просто проверить, есть ли в настоящее время Toast показывается перед созданием другого.

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

Вы можете даже сделать этот последний фрагмент в частный метод showToast(text) рефакторинг кода, если вам нужно отобразить различные текстовые сообщения.

Смежные вопросы