【问题标题】:Finish activity after toast message disappears?Toast 消息消失后​​完成活动?
【发布时间】:2011-11-28 06:36:39
【问题描述】:

有谁知道,如果有可能在 toast 消息上做某事(在我的情况下完成活动)将被关闭?

【问题讨论】:

    标签: android toast


    【解决方案1】:

    您只需创建一个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.LENGTH_LONG 添加到 sleep 方法中,以获得完全匹配
    • 为那些没有提及原因而投反对票的人安息:)
    • 这里的新线程太过分了,至少你可以使用 Handler().postDelayed({...},Toast.LENGTH_LONG )。此外,您可能会以这种方式使用新线程更改配置时发生内存泄漏
    • 亚历克西。 . .请分享示例。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        是的,但这是一种诡计

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

        【讨论】:

        • 不要对延迟做出假设!这些可能会在不同的 API 版本中发生变化。
        • 我知道,但这是他现在想要做的唯一方法。
        • 也许你是对的,getDuration 只返回 LENGTH_SHORT 或 LENGTH_LONG,它们是常量 0 / 1。不是以毫秒为单位的实时。
        【解决方案5】:

        这就是我的做法......

        请注意,该类包括关闭调用它的活动的调用。如果需要,您可以将其取出。

        另外,请注意,睡眠时间会跟踪 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) );
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我不确定你是否可以使用 Toasts 做到这一点,但是,你可以用一个简单的对话框替换 toast(如果你愿意,可以重复使用 Toast 设计),然后你可以使用诸如 onDetachedFromWindow 之类的方法来挂钩关闭activity到window的。

            【讨论】:

              【解决方案8】:

              我不确定您的用例是什么,但您真的需要等待 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()!

              【讨论】:

                【解决方案9】:

                我刚刚为那个“问题”制作了一个简单的库下载:

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

                【讨论】:

                  【解决方案10】:

                  Afaik INotificationManager API(在 toast 类的底层使用)不支持在关闭 Toast 时通知调用者。

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

                  【讨论】:

                    【解决方案11】:

                    您调用 toast,然后使用 Onstop() 完成。你的吐司现在会出现。

                    【讨论】:

                      【解决方案12】:

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

                      【讨论】:

                      • 不要认为这是一个选项... Toast 使用 INotificationManager,所以没有办法通知调用者。
                      【解决方案13】:

                      从 API 级别 30 开始,Toast 类有一个 addCallback 方法。见这里:addCallback documentation

                      【讨论】:

                        猜你喜欢
                        • 2020-05-21
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2023-03-29
                        • 1970-01-01
                        相关资源
                        最近更新 更多