2011-09-30 109 views

回答

42

只需创建一个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(3500); // As I am using LENGTH_LONG in Toast 
        Your_Activity.this.finish(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      }; 
+2

太棒了! Thx :)因此,您可以将Toast.LENGTH_LONG添加到睡眠方法中,以获得完全匹配 –

+0

对于那些没有提及原因而进行倒票的人来说,RIP可以是:) –

9

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

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

1

我不确定你可以用Toast做到这一点,但是,你可以通过简单的对话来替换烤面包(并且如果你想要重用烤面包设计),然后你可以使用诸如onDetachedFromWindow等方法来挂钩活动关闭窗口的。

2

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

7

是的,但这是一个诡计方式

的Android吐司没有一种方法来设置回调它完成之后。

所以,你可以基于这个事实

private static final int LONG_DELAY = 3500; // 3.5 seconds 
private static final int SHORT_DELAY = 2000; // 2 seconds 

现在你可以做做什么:

  1. 设置敬酒
  2. 设置基础上,LENGTH_LONG计数器线程(3.5 s)或LENGTH_SHORT(2s)关闭活动。
  3. toast.show()和thread.start();
+0

不要对延误的假设!这些可能会在不同的API版本中改变。 –

+0

我知道,但这是做他现在想做的事情的唯一方法。 –

+2

也许你是对的,getDuration只返回LENGTH_SHORT或LENGTH_LONG,它们是常量0/1。不是以ms为单位的实时。 –

0

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

还没有办法检查Toast是否显示或隐藏,而无需使用反射来挑选表示暂时通知的内部类。

0

你使用Onstop()调用toast,完成。你的面包现在会出现。

0

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

+0

嗯..一些更多的细节? – Tima

+0

不认为这是一个选项...吐司使用INotificationManager,所以没有办法通知调用者。 –

2

这里是我如何做到这一点?

注意,这类包含一个调用来关闭调用它的活动。如果需要,你可以把它拿出来。

此外,请注意,睡眠时间跟踪吐司持续时间,但我已经增加了额外的半秒,以在活动结束前留出一点余量。

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

我不知道你的使用情况是什么,但你真的需要等待敬酒接近完成你的活动?

就我而言,我有一个活动,它是从一个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; 
    } 
    ... 
} 

这显示了面包,我没有等到它调用之前完成不再显示()。起初,我认为这不起作用,但后来我发现这是因为我忘了在烤面包上打电话给show()。

11

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