1. Toast 普通自定义方式
这是stackoverflow上最多的答案,DEMO代码如下:
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.toast_layout,
(ViewGroup) findViewById(R.id.toast_layout_root));
ImageView image = (ImageView) layout.findViewById(R.id.image);
image.setImageResource(R.drawable.android);
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("Hello! This is a custom toast!");
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
2. 利用AlertDialog来自定义Toast
第一种方式其实很多情况是可以的,但是由于不同设备toast动画似乎不同(经过我们测试),举例下我们公司的一个应用场景,我们需要一个整个背景半透明的toast,但是用1方法,在有些设备由于它的Toast有抖动的效果,导致整个看过去屏幕也抖动了一下,后来我们决定用AlertDialog自定义,按原来的认知我们一直以为AlertDialog依赖于当前某个activity,才可以,这样比toast麻烦很多你需要关系activity是否被释放,于是乎我决定去研究下Toast源码,发现一个有意思的代码:
final WindowManager.LayoutParams params = mParams;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.format = PixelFormat.TRANSLUCENT;
这句话可以指定动画
params.windowAnimations = com.android.internal.R.style.Animation_Toast;
这句话可以实现全局toast
params.type = WindowManager.LayoutParams.TYPE_TOAST;
params.setTitle("Toast");
params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
有了这句话你就可以用application context作为构建dialog的context,从而实现全局:
以下是我们的部分实现代码:
mToastStyle = toastStyle;
if (mToast == null) {
mToast = new AlertDialog.Builder(MyApplication.getInstance()).create();
}
mToast.setOnKeyListener(new Dialog.OnKeyListener() {
@Override public boolean onKey(DialogInterface arg0, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
}
return false;
}
});
mWindow = mToast.getWindow();
WindowManager.LayoutParams wmlp = mWindow.getAttributes();
wmlp.dimAmount = 0.5f;
mWindow.setAttributes(wmlp);
mWindow.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
mWindow.setBackgroundDrawableResource(R.drawable.transparent_drawable);
wmlp.type = WindowManager.LayoutParams.TYPE_TOAST;
mToast.setCancelable(true);
mToast.setCanceledOnTouchOutside(true);
mToast.show();
mWindow.setContentView(getLayoutByType(mToastStyle));
mWindow.setGravity(Gravity.CENTER);