【发布时间】:2011-11-28 06:36:39
【问题描述】:
有谁知道,如果有可能在 toast 消息上做某事(在我的情况下完成活动)将被关闭?
【问题讨论】:
有谁知道,如果有可能在 toast 消息上做某事(在我的情况下完成活动)将被关闭?
【问题讨论】:
您只需创建一个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();
}
}
};
【讨论】:
它应该首先显示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);
【讨论】:
android.widget.Toast 不提供任何监听器来通知它何时完成。
您可以调用 Toast.getDuration() 来了解它会持续多长时间,并让您自己的 TimerTask 在 Toast 消失时运行,并在那里执行您的任务。
【讨论】:
是的,但这是一种诡计
Android Toast 无法在完成后设置回调。
所以你能做的就是基于这个事实
private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds
现在你可以这样做了:
【讨论】:
这就是我的做法......
请注意,该类包括关闭调用它的活动的调用。如果需要,您可以将其取出。
另外,请注意,睡眠时间会跟踪 toast 的持续时间,但我增加了半秒,以便在活动结束前留出一点余量。
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) );
【讨论】:
实际上,当Toast 完成时没有回调,但是如果您需要知道何时关闭它,您可以启动一个后台线程,该线程将休眠等于Toast 持续时间的毫秒数,然后执行所需的操作。这只是解决问题的一种方法,我相信还有更多的解决方案。希望这会有所帮助。
【讨论】:
我不确定你是否可以使用 Toasts 做到这一点,但是,你可以用一个简单的对话框替换 toast(如果你愿意,可以重复使用 Toast 设计),然后你可以使用诸如 onDetachedFromWindow 之类的方法来挂钩关闭activity到window的。
【讨论】:
我不确定您的用例是什么,但您真的需要等待 toast 关闭以完成您的活动吗?
就我而言,我有一个活动,它是从 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;
}
...
}
这显示了 toast,我不必等到它不再显示再调用finish()。最初,我认为这不起作用,但后来我发现这是因为我忘记在 toast 上调用 show()!
【讨论】:
我刚刚为那个“问题”制作了一个简单的库下载:
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
}
});
【讨论】:
Afaik INotificationManager API(在 toast 类的底层使用)不支持在关闭 Toast 时通知调用者。
如果不使用反射来挑选代表瞬态通知的内部类,也无法检查 Toast 是显示还是隐藏。
【讨论】:
您调用 toast,然后使用 Onstop() 完成。你的吐司现在会出现。
【讨论】:
扩展 Toast-Class 并使用您自己的回调。
【讨论】:
从 API 级别 30 开始,Toast 类有一个 addCallback 方法。见这里:addCallback documentation
【讨论】: