现在项目中经常会涉及到弹窗的操作,有时候我们会用windmanager来直接加载一个布局作为弹窗,有时候一些简单的弹窗也可以用继承dialog的形式自定义弹窗,同样可以达到预想的效果。下面贴出一段创建自定义弹窗的代码片:
Dialog mDialog = new Dialog(context, R.style.dialog);
Window window = mDialog.getWindow();
window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
WindowManager.LayoutParams params = window.getAttributes();
params.gravity = Gravity.TOP|Gravity.CENTER_HORIZONTAL;
params.height = LayoutParams.WRAP_CONTENT;
params.width = LayoutParams.WRAP_CONTENT;
params.y = 480;
params.dimAmount = 0.8f;
window.setAttributes(params);
mDialog.setContentView(R.layout.window_volume_layout);
mDialog.setFeatureDrawableAlpha(Window.FEATURE_OPTIONS_PANEL, 0);
mDialog.show();
mDialog.setCanceledOnTouchOutside(true);
下面讲一下重要的方法和属性:
1、
window.setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
这里设置弹窗的层级,数值越大层级就会越高,也就越会浮在最顶端。当用到的是一般的应用层级的时候,window的token,也就是我们构造Dialog时候的Context必须是Activity;如果是系统级的类型参数的时候,必须是全局的ApplicationContext才可以,同时还需要获取到系统级应用的权限。比如上面代码中就是系统级层级,需要获取到系统应用权限。
2、
params.gravity = Gravity.TOP|Gravity.CENTER_HORIZONTAL;
params.y = 480;
这是弹窗显示位置的参数设置。gravity是停靠的类型,上面代码是y轴停靠顶端,x轴居中显示。params.y这个参数需要结合gravity才能达到效果,比如这里代表的是y方向距离顶部480个像素。
3、
mDialog.show();
mDialog.setCanceledOnTouchOutside(true);
如果想要点击弹窗的其他地方就让弹窗消失的效果,就需要设置setCanceledOnTouchOutside(true)这个方法。需要注意的是,此方法必须在show()方法调用之后再设置才有效果,同时需要注意,不过不设置
params.height = LayoutParams.WRAP_CONTENT;
params.width = LayoutParams.WRAP_CONTENT;
这两个属性,那么很可能会让弹窗背景是透明充满整个屏幕的,导致点击弹窗显示部分之外的地方弹窗不消失。