吐司消息消失后​​完成活动?

时间:2011-09-30 07:45:16

标签: android toast

有人知道,如果有可能做某事(在我的情况下完成活动),吐司留言会被关闭吗?

13 个答案:

答案 0 :(得分:45)

您只需创建一个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();
                }
             }  
           };

答案 1 :(得分:14)

首先应显示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);

答案 2 :(得分:9)

android.widget.Toast不提供任何监听器来通知它何时完成。

您可以调用Toast.getDuration()来了解它将持续多长时间,并让自己的TimerTask在Toast消失时运行,然后在那里完成任务。

答案 3 :(得分:8)

是的,但这是一种技巧方式

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.5s)或LENGTH_SHORT(2s)设置计数器线程以关闭活动。
  3. toast.show()和thread.start();

答案 4 :(得分:3)

我是这样做的......

请注意,此类包含一个调用来关闭调用它的活动。如果需要,你可以把它拿出来。

另外,请注意睡眠时间跟踪吐司的持续时间,但我在活动结束前增加了一半额外的余量。

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

答案 5 :(得分:2)

实际上在Toast完成时没有回调,但是如果你需要知道,何时关闭它,你可以启动一个后台线程,它将睡眠等于{{的几毫秒1}} duration,然后执行所需的操作。这只是解决问题的一种方法,我相信还有更多的解决方案。希望这会有所帮助。

答案 6 :(得分:1)

我不确定你能用Toasts做到这一点,但是,你可以通过一个简单的对话框替换吐司(并根据需要重用Toast设计),然后你可以使用onDetachedFromWindow之类的方法挂钩活动的关闭到窗口。

答案 7 :(得分:1)

我不确定你的用例是什么,但是你真的需要等待吐司才能完成你的活动吗?

在我的情况下,我有一个活动,它是从网址进入应用程序的入口点(允许通过电子邮件或网页上的链接打开该应用程序)。如果网址没有通过验证检查,我会显示一个祝酒词并完成活动:

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()!

答案 8 :(得分:1)

我只为这个"问题"做了一个简单的图书馆。下载:

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 :(得分:0)

Afaik INotificationManager API(在toast类的引擎下使用)没有任何支持在关闭Toast时通知调用者。

如果没有使用反射来挑选代表瞬态通知的内部类,也无法检查Toast是显示还是隐藏。

答案 10 :(得分:0)

你打电话给toast,完成使用Onstop()。你的吐司现在会出现。

答案 11 :(得分:0)

扩展Toast-Class并使用您自己的回调。

答案 12 :(得分:0)

从 API 级别 30 开始,Toast 类有一个 addCallback 方法。请参阅此处:addCallback documentation