Остановите все тостовые сообщения при переходе на другой экран в Android - PullRequest
4 голосов
/ 14 марта 2011

enter image description here enter image description here

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

Я написал следующий код:

public class Main extends Activity {

    Dialog d;
    Toast t;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ((Button)findViewById(R.id.button1)).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                t = Toast.makeText(Main.this, "you clicked on button!", Toast.LENGTH_LONG);
                t.show();
            }
        });
    }
    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        t.cancel();
    }
}

Как я могу это сделать?

Ответы [ 3 ]

7 голосов
/ 14 марта 2011

Привет, у меня та же проблема. Проблема в том, что тост перекрывается, например, если вы нажмете 10 раз, тост останется 10 х LENGTH_SHORT. Единственное решение, с которым я пришел, - контролировать время показа тоста. Когда вы показываете тост, просто следите за тем, когда вы в последний раз показывали его, он все еще на экране, не показывайте его снова. В вашем худшем случае тост будет виден только LENGTH_SHORT раз.

6 голосов
/ 28 июня 2012

Toast.makeText возвращает объект Toast.Вы можете вызвать cancel() для этого объекта, чтобы отменить его, а затем показать новый.

1 голос
/ 13 ноября 2016

Это простое решение отлично работает для меня, единственное устройство, которое отменяет любые показанные в данный момент тосты:

public enum SingleToast {
    INSTANCE;

    private Toast currentToast;
    private String currentMessage;

    public void show(Context context, String message, int duration) {
        if (message.equals(currentMessage)) {
            currentToast.cancel();
        }
        currentToast = Toast.makeText(context, message, duration);
        currentToast.show();

        currentMessage = message;
    }
}

Если вы хотите отменить ЛЮБОЙ тост (даже если сообщения отличаются), вы можете оставитьиз общей части currentMessage и включите currentToast! = null в качестве проверки отмены.

Недостаток первого метода заключается в том, что при запуске 2 разных тостов (#1 и # 2), вы больше не сможете отменить их при запуске # 1: это происходит потому, что синглтон сохранил # 2 как «текущий», даже если он еще не показан.Поэтому, когда вы снова запустите # 1, он все равно будет добавлен в очередь из 2 тостов: # 1, # 2, # 1, и все будет показано.

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

Вызов тоста прост: я использую его, чтобы показать сообщение с некоторыми пользовательскими исключениями:

public abstract class CustomToastException extends Exception {
    public CustomToastException(String message) {
        super(message);
        SingleToast.INSTANCE.show(context, getMessage(), Toast.LENGTH_LONG);
    }
}

Обратите внимание, вЕсли кому-то было интересно: я поднял новый вопрос, не вызывает ли мое решение каких-либо проблем: Статический контекст, сохраненный в классе Application и используемый в сборщике тостов singleton, создает ли это утечку памяти?

...