Как отменить тост - PullRequest
       18

Как отменить тост

24 голосов
/ 09 декабря 2010

Я разработал приложение для Android и столкнулся с проблемой Toast. Предположим, я показываю тост, он отображается в окне приложения. Когда появляется диалоговое окно, тост не исчезает мгновенно.

Я хочу знать, как я могу отменить тост.

Ответы [ 7 ]

43 голосов
/ 09 декабря 2010

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

6 голосов
/ 15 марта 2012

Самая короткая продолжительность, которую вы можете указать для тоста, равна Toast.LENGTH_SHORT, которая имеет значение 0, но фактически 2000 milliseconds long.Если вы хотите, чтобы он был короче, попробуйте следующее:

    final Toast toast = Toast.makeText(ctx, "This message will disappear in 1 second", Toast.LENGTH_SHORT);
    toast.show();

    Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
           @Override
           public void run() {
               toast.cancel(); 
           }
    }, 1000); //specify delay here that is shorter than Toast.LENGTH_SHORT
4 голосов
/ 19 июля 2013

Я думаю, что нет необходимости создавать собственные тосты.

Создать только один экземпляр класса Toast.Мы просто устанавливаем текст тоста, используя toast.setText("string"), и вызываем метод toast.cancel() в методе onDestroy().

Фрагмент рабочего кода следующим образом:

package co.toast;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class ShowToastActivity extends Activity {
    private Toast toast = null;
    Button btnShowToast;

    @SuppressLint("ShowToast")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // creates only one toast object..
        toast = Toast.makeText(getApplicationContext(), "", Toast.LENGTH_LONG);

        btnShowToast = (Button) findViewById(R.id.btnShowToast);

        btnShowToast.setOnClickListener(new OnClickListener() {

             @Override
             public void onClick(View v) {

                // only set text to toast object..
                toast.setText("My toast!");
                toast.show();
            }
        });
    }

    @Override
    protected void onDestroy() 
    {
        toast.cancel();
        super.onDestroy();
    }

    @Override
    protected void onStop () {
        super.onStop();
        toast.cancel();
    }
}

Надеюсь, что это полезно для вас

0 голосов
/ 09 марта 2018
Toast toast;

private void showToast(String text) {
    if (toast!=null)
        toast.cancel();
    toast = Toast.makeText(context, text, Toast.LENGTH_SHORT);
    toast.show();
}
0 голосов
/ 30 августа 2015

Хорошо, я тоже пытаюсь отменить Toast и, похоже, не могу получить вызов cancel () для вызова в Activity.onDestroy () или Activity.onStop () и т. Д. После некоторого API-документальное чтение и поиск в Google других, нуждающихся в помощи для отмены тостов, я думаю, что до сих пор не ясно, когда деятельность будет остановлена, приостановлена, уничтожена.Мне нужен безошибочный способ заставить мою деятельность приостановиться или остановиться.

В моем конкретном случае, поскольку есть только короткие и длинные тосты, я решил повторить цикл 5 раз, выполняя шоу () длинного тоста, поэтому он будет отображаться на экране в течение 15-20 секунд.Это прекрасно работает!

Но недостатком (отрицательным побочным эффектом) использования объекта Toast является то, что они сохраняются даже ПОСЛЕ того, как пользователь покидает ваше приложение и возвращается на домашний экран и начинает использовать какое-то другое приложение... твой тост будет жить в течение следующих 15-20 секунд, если вы не можете гарантировать, что сможете найти какое-то место (каким-либо образом) для вызова функции отмены ().Кроме того, вы должны верить, что Android выполнит ваш звонок на метод cancel ()!

Итак, для этого я настраивал свой простой цикл, пытался вызывать отмены прямо в цикле и доказывал себеон выполнит вызов отмены и будет вести себя как положено.

Фрагмент кода: Примечание: 'toast' является публичной переменной INSTANCE, поэтому у нас есть только ОДИН экземпляр объекта Toast [как рекомендовано выше, и который, как подтвердил комментатор, работал два года назад, в ActivityonStop () и OnDestroy ()]

toast = Toast.makeText(ctxt, result, Toast.LENGTH_LONG);
    for (int i=0; i < 5; i++)
    {
        // Long-toasts each last about 3.5 secs
        toast.show();

        android.os.SystemClock.sleep(1500);
        toast.cancel();
        android.os.SystemClock.sleep(1500);
        toast = Toast.makeText(ctxt, result, Toast.LENGTH_LONG);
    }

Хорошо, исходный цикл содержал только одну строку, делающую шоу.Это само по себе работает.

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

Я ожидал увидеть тост в течение примерно 1,5 секунд, затем увидеть, как он исчезает, и вернуться через 1,5 секунды и т. д.

Угадайте, что... тост никогда не появляется ВСЕ!

Хорошо, я нахожусь в полном бормотании ... что мне не хватает, в понимании внутренних загадок того, как класс Toast реализован и являетсядолжен вести себя?

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

[Примечание: Я ЧИТАЮ этот форум МНОГО ...это великолепно !!!Это моя первая публикация в середине обсуждения темы ... Извините, что мой ответ помечается как ОТВЕТ, а не как ВОПРОС, относящийся к теме этой темы.]

0 голосов
/ 02 июня 2015

Это базовый пример использования cancel() метода Toast.

Toast mytoast;
mytoast = Toast.makeText(getApplicationContext(), "Hi Ho Jorgesys! ", Toast.LENGTH_LONG);
mytoast.show();
....
....
....
if(CancelToast){
  mytoast.cancel();
}
0 голосов
/ 22 ноября 2012

Использовать метод отмены tost: toast.cancel ();

...