有人知道,如果有可能做某事(在我的情况下完成活动),吐司留言会被关闭吗?
答案 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
现在你可以这样做:
答案 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