Android - Скрыть все показанные тостовые сообщения - PullRequest
53 голосов
/ 03 мая 2010

Как удалить все всплывающие сообщения, отображаемые в данный момент?

В моем приложении есть список, когда пользователь нажимает на элемент, отображается сообщение с тостом, 10 предметов - 10 тостов.

Таким образом, если пользователь нажимает 10 раз, а затем нажимает кнопку меню, ему нужно подождать несколько секунд, пока он не сможет прочитать текст пункта меню.

Так не должно быть :)

Ответы [ 15 ]

0 голосов
/ 14 декабря 2016

В моем приложении тосты в очереди появляются снова и снова, когда приложение переходит в фоновый режим, поэтому я сделал следующее, чтобы решить проблему.

Добавьте код, чтобы определить, когда приложение переходит в фоновый режим. Один из способов зарегистрировать обработчик жизненного цикла. Для получения более подробной информации ref

registerActivityLifecycleCallbacks(new MyLifecycleHandler());

App.inBackground = true; когда приложение переходит в фоновый режим и показывает тост, используя класс 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();
    }

}

вызов метода SmartToast.cancelAll();, когда приложение переходит в фоновый режим, чтобы скрыть текущие и все ожидающие тосты. Код это весело. Наслаждайтесь!

0 голосов
/ 09 марта 2015

Используя превосходный ответ Мадура выше, я расширил его до класса, который будет заниматься различными типами сообщений:

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

И это вызвано моей основной деятельностью:

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

Причина классификации сообщений состоит в том, чтобы убедиться, что никакие важные сообщения не перезаписаны. Это решение, кажется, легко использовать повторно, поскольку оно включает только переименование тостов и имен функций. * +1007 *

Когда пользователь нажмет кнопку, тост будет отменяться каждый раз для одного и того же типа сообщения. Единственная проблема заключается в том, если пользователь может спамить смесь сообщений. Это приводит к тому, что первое сообщение повторяется, и как только оно истекает, остальные сообщения отображаются по одному разу. Не очень большая проблема, но о чем нужно знать.

Я не рассматривал возможные недостатки наличия нескольких экземпляров Toast.

0 голосов
/ 26 июля 2014

Вы можете использовать как это ..

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();
}
}
0 голосов
/ 27 марта 2012

Вот как отключить тост сообщения, удалить выражение show().

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

//Enable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();
0 голосов
/ 18 августа 2011
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();

            }
        });
...