前言
Android里边的Toast控件是应用与用户交互的窗口,用于提示或者警告用户一些交互的信息,但是我们会发现就算设置了Toast.LENGTH_LONG,也只有那么几秒钟时间,那么如何将这一时间随意设置呢?!
方法
首先我们写一方法:
public void showMyToast(final Toast toast, final int cnt) {
final Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
toast.show();
}
}, 0, 3500);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
toast.cancel();
timer.cancel();
}
}, cnt );
}
当然我们也可以将此方法设为static,加入到工具类中,方便调用。
接下来使用方法:
Toast toast=Toast.makeText(RegistActivity.this, "这是可以随意设置时间的Toast", Toast.LENGTH_LONG);
showMyToast(toast, 9*1000);
需要注意的地方:
- 创建Toast对象的时候,要设置Toast.LENGTH_LONG,最后不要调用show()方法。
- showMyToast()方法,传入两个参数,第一个参数为我们创建的Toast对象,第二个参数为我们想要设置显示的毫秒数!
这个方法呢,算是比较巧妙的,也有投机取巧的成分!
因为Android系统Toast的显示,是存在一个Toast队列的,当一个Toast显示之后,它会从队列中取出来下一个来显示!
还有在源码中Toast.LENGTH_LONG
显示时间有3500毫秒,LENGTH_SHORT
显示时间为2000毫秒,这个我们可以在源码中找到:
在frameworks\base\services\Java\com\android\server
路径下有个NotificationManagerService.java
的文件:
private static final int LONG_DELAY = 3500;
private static final int SHORT_DELAY = 2000;
我们这里采用的方法,使用一个Timer去调度一个TimeTask,delay设置的是0s,所以立即执行toast.show()
,然后每隔3.5s就又执行一遍,依次类推!
最后,使用另一个Timer去调度取消之前的timer和撤销toast,而这里设置了延迟cnt
毫秒执行,这里的cnt
就是我们想要展示的毫秒数!