Android 在toast消息消失后完成活动?
是否有人知道,如果有可能在toast上执行某些操作(在我的例子中是“完成”活动),则消息将被关闭?android.widget.toast不提供任何侦听器来通知何时完成Android 在toast消息消失后完成活动?,android,toast,Android,Toast,是否有人知道,如果有可能在toast上执行某些操作(在我的例子中是“完成”活动),则消息将被关闭?android.widget.toast不提供任何侦听器来通知何时完成 您可以调用Toast.getDuration()来了解它将持续多长时间,并使您自己的TimerTask在Toast消失时运行,并在那里执行任务。我不确定您是否可以使用Toast来执行此操作,但是,您可以通过一个简单的对话框来替换Toast(如果您愿意,可以重用Toast设计),然后,您可以使用诸如将活动的关闭挂接到窗口的方法。实
您可以调用Toast.getDuration()来了解它将持续多长时间,并使您自己的TimerTask在Toast消失时运行,并在那里执行任务。我不确定您是否可以使用Toast来执行此操作,但是,您可以通过一个简单的对话框来替换Toast(如果您愿意,可以重用Toast设计),然后,您可以使用诸如将活动的关闭挂接到窗口的方法。实际上,当
Toast
完成时,没有回调,但是如果您需要知道它何时关闭,您可以启动一个后台线程,该线程将休眠相当于Toast
持续时间的毫秒数,然后执行所需的操作。这只是解决问题的一种方法,我相信还有更多的解决办法。希望这能有所帮助。是的,但这是一种诡计
Android Toast无法在完成后设置回调
所以你能做的就是基于这个事实
private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds
现在您可以执行以下操作:
Afaik INotificationManager API(在toast类的引擎盖下使用)不支持在关闭toast时通知调用方
如果不使用反射来找出表示临时通知的内部类,也无法检查Toast是否显示或隐藏。您调用Toast,然后使用Onstop()完成调用。您的祝酒词现在将出现 扩展Toast类并使用您自己的回调。您只需创建一个
线程,只要显示Toast
,就可以完成活动
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();
}
Toast.makeText(YourActivity.this, "MESSAGE", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
YourActivity.this.finish();
}
}, 2000);
现在创建一个等待(长度长=3.5)或(长度短=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();
}
}
};
我是这样做的
请注意,此类包含一个用于关闭调用它的活动的调用。如果需要的话,你可以把它拿出来
另外,请注意,睡眠时间跟踪烤面包的持续时间,但我额外增加了半秒,以便在活动结束前留出一点空间
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) );
我不确定您的用例是什么,但您真的需要等待祝酒辞结束才能完成活动吗
在我的例子中,我有一个活动,它是从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() 它应该首先显示Toast
,然后在2秒钟后,它将完成您的活动
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();
}
Toast.makeText(YourActivity.this, "MESSAGE", Toast.LENGTH_SHORT).show();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
YourActivity.this.finish();
}
}, 2000);
我刚刚为该“问题”下载制作了一个简单的库:
并以这种方式使用它:
Toaster.getInstance().makeText(context, "your custom message", Toast.LENGTH_SHORT, new OnToasterFinish() {
@Override
public void finish() {
// Your code over here after the Toast
}
});
从API级别30开始,Toast类有一个addCallback
方法。请参见此处:不要对延迟进行假设!这些可能会在不同的API版本中发生变化。我知道,但这是他现在想要做的唯一方法。也许你是对的,getDuration只返回LENGTH\u SHORT或LENGTH\u LONG,这是常量0/1。在ms中不是实时的。不要认为这是一个选项。。。Toast使用INotificationManager,因此无法通知来电者。太好了!Thx:)因此,您只需将Toast.LENGTH_LONG添加到sleep方法中,就可以为那些投票失败的人提供准确的matchRIP,而不必提及原因:)新线程在这里是多余的,至少您可以使用Handler().postDelayed({…},Toast.LENGTH_LONG)。另外,在使用新线程进行配置更改时,可能会出现内存泄漏。共享示例plz。