Dialog弹窗操作相关注意事项

现在项目中经常会涉及到弹窗的操作,有时候我们会用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;
这两个属性,那么很可能会让弹窗背景是透明充满整个屏幕的,导致点击弹窗显示部分之外的地方弹窗不消失。

猜你喜欢

转载自blog.csdn.net/yus201120/article/details/81634849