发现系统的Toast的cancel机制有问题,一旦把前一个cancel掉再显示新的Toast时,新的Toast会卡住一段时间显示不出来。
建立一个自己的Toast系统需要注意的几个地方:
1、建立Service专门负责显示、隐藏等
2、在Service中使用WindowManager的addView和removeView实现显示、隐藏
3、注意需要设置的flag、format和type等参数
4、在AndroidManifest.xml中添加权限如下:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
不加上面这个权限的话,会把系统当前窗口的焦点给夺过去。
关键代码如下:
public void show(Context context, String content) {
WindowManager windowManager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
if (tv != null) {
windowManager.removeView(tv);
}
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.y += 20;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
params.format = PixelFormat.TRANSLUCENT;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
LayoutInflater layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
tv = (TextView) layoutInflater.inflate(R.layout.renren_toast, null);
tv.setText(content);
windowManager.addView(tv, params);
}
补充于:2011.11.18
找到解决方案了,直接把原来的Toast拿过来重新设置显示文本、时间就可以了。