Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在toast消息消失后完成活动?_Android_Toast - Fatal编程技术网

Android 在toast消息消失后完成活动?

Android 在toast消息消失后完成活动?,android,toast,Android,Toast,是否有人知道,如果有可能在toast上执行某些操作(在我的例子中是“完成”活动),则消息将被关闭?android.widget.toast不提供任何侦听器来通知何时完成 您可以调用Toast.getDuration()来了解它将持续多长时间,并使您自己的TimerTask在Toast消失时运行,并在那里执行任务。我不确定您是否可以使用Toast来执行此操作,但是,您可以通过一个简单的对话框来替换Toast(如果您愿意,可以重用Toast设计),然后,您可以使用诸如将活动的关闭挂接到窗口的方法。实

是否有人知道,如果有可能在toast上执行某些操作(在我的例子中是“完成”活动),则消息将被关闭?

android.widget.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
现在您可以执行以下操作:

  • 烤面包
  • 根据长度长(3.5s)或长度短(2s)设置计数器线程以关闭活动
  • toast.show()和thread.start()
    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。