Завершить деятельность после исчезновения тостового сообщения? - PullRequest
25 голосов
/ 30 сентября 2011

Кто-нибудь знает, есть ли возможность что-то сделать (в моем случае завершить действие), чтобы сообщение о тосте было закрыто?

Ответы [ 12 ]

45 голосов
/ 30 сентября 2011

Вы делаете это просто путем создания Thread, который длится до тех пор, пока отображается Toast, а затем вы можете закончить Activity.

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            // your other stuff
            Toast.makeText(this,"This is a Toast", Toast.LENGTH_LONG).show();
            thread.start();
}

Теперь создайте темукоторый ожидает (LENGTH_LONG = 3,5) или (LENGTH_SHORT = 2) секунды

    Thread thread = new Thread(){
             @Override
            public void run() {
                 try {
                    Thread.sleep(Toast.LENGTH_LONG); // As I am using LENGTH_LONG in Toast
                    Your_Activity.this.finish();
                } catch (Exception e) {
                    e.printStackTrace();
                }
             }  
           };
15 голосов
/ 08 ноября 2014

Сначала он должен отобразить Toast, затем через 2 секунды он завершит ваш activity.

Toast.makeText(YourActivity.this, "MESSAGE", Toast.LENGTH_SHORT).show();

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        YourActivity.this.finish();
    }
}, 2000);
9 голосов
/ 30 сентября 2011

android.widget.Toast не предлагает никаких слушателей, чтобы сообщить, когда это закончится.

Вы можете вызвать Toast.getDuration (), чтобы узнать, как долго он продлится, и настроить собственную функцию TimerTask для запуска в момент исчезновения Toast и выполнять там свои задачи.

8 голосов
/ 30 сентября 2011

Да, но это хитрый способ

У Android Toast нет способа установить обратный вызов после его завершения.

Так что вы можете сделать, основываясь на этом факте

private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds

теперь вы можете сделать:

  1. Установить тост
  2. Установить счетчик потока на основе LENGTH_LONG (3,5 с) или LENGTH_SHORT (2 с)закрыть деятельность.
  3. toast.show () и thread.start ();
3 голосов
/ 05 июля 2012

Вот как я это делаю ...

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

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

public class Toaster implements Runnable
{
Context         theContext;
CharSequence    theMessage;
int             theDuration;
Activity        theActivity;

public Toaster( Activity a, Context c, CharSequence s, int i )
{
    theActivity = a;
    theContext = c;
    theMessage = s;
    theDuration = i;
}

@Override
public void run() 
{
    Toast toast = Toast.makeText(theContext, theMessage, theDuration );
    toast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL, 0, 0);
    toast.show();   

    Thread t = new Thread( new Runnable()
    {
        @Override
        public void run()
        {
            try 
            {
                Thread.sleep(theDuration == Toast.LENGTH_SHORT ? 2500 : 4000);
            }
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }

            theActivity.finish();
        }

    });
    t.start();
}
}

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

    Context c = getApplicationContext();
    CharSequence msg = "Form Data Submitted!";
    int duration = Toast.LENGTH_SHORT;

    runOnUiThread( new Toaster(this, c, msg, duration) );
2 голосов
/ 30 сентября 2011

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

1 голос
/ 26 сентября 2016

Я просто создал простую библиотеку для этой "проблемы". Скачать:

https://github.com/mkiisoft/Toaster

и используйте его так:

Toaster.getInstance().makeText(context, "your custom message", Toast.LENGTH_SHORT, new OnToasterFinish() {
                @Override
                public void finish() {
                    // Your code over here after the Toast
                }
            });
1 голос
/ 04 марта 2014

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

В моем случае у меня есть действие, которое является точкой входа в приложение с URL-адреса (позволяющим открыть приложение по ссылке в электронном письме или на веб-странице). Если URL не проходит проверку правильности, я показываю тост и заканчиваю действие:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ...

    if (!validateUrl()) {
        Toast.makeText(this, R.string.invalid_url, Toast.LENGTH_LONG).show();
        finish();
        return;
    }
    ...
 }

Это показывает тост, и мне не нужно ждать, пока он больше не будет отображаться, прежде чем вызывать финиш (). Сначала я думал, что это не работает, но потом я обнаружил, что это потому, что я забыл вызвать show () на тосте!

1 голос
/ 30 сентября 2011

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

0 голосов
/ 30 сентября 2011

Расширьте класс тостов и используйте свой собственный обратный вызов.

...