Подтвердить что ты не робот

Закончить активность после сообщения тоста исчезнет?

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

4b9b3361

Ответ 1

Вы делаете это просто, создавая 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(3500); // As I am using LENGTH_LONG in Toast
                    Your_Activity.this.finish();
                } catch (Exception e) {
                    e.printStackTrace();
                }
             }  
           };

Ответ 2

Сначала он должен отображать 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);

Ответ 3

android.widget.Toast не предлагает слушателям сообщать, когда он будет завершен.

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

Ответ 4

Да, но это трюк

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

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

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

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

  • Настройка тоста
  • Настройте поток счетчика на основе LENGTH_LONG (3.5s) или LENGTH_SHORT (2s), чтобы закрыть активность.
  • toast.show() и thread.start();

Ответ 5

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

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

Afaik API INotificationManager (который используется под капотом класса тостов) не имеет поддержки для уведомления вызывающего абонента, когда он закрывает Toast.

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

Ответ 10

Вы вызываете тост, затем завершаете, используя Onstop(). Теперь появится ваш тост.

Ответ 11

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

Ответ 12

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

В моем случае у меня есть активность, которая является точкой входа в приложение из 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;
    }
    ...
 }

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