之前在维护一个项目,根据产品需求去改变自定义的Dialog的UI。我很快就修改好了,但是我遇到setCanceledOnTouchOutside(true)
和setCancelable(true)
出现无效的情况。
setCanceledOnTouchOutside方法作用
点击对话框外部区域是否允许对话框消失或者说点击屏幕或物理返回键,false不消失,true消失。
setCancelable方法作用
点击手机返回按键是否允许对话框消失或者弹出后会点击屏幕,false不消失,true消失;点击物理返回键dialog消失。
正常情况设置:
setCanceledOnTouchOutside(true);
setCancelable(true);
这样是可以点击Dialog的外部区域,Dialog是会消失的。但是没有消失,这是为什么呢?
认真阅读了原来的代码,发现有一段代码是这样的:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
WindowManager.LayoutParams params = getWindow().getAttributes();
params.width = ViewGroup.LayoutParams.MATCH_PARENT;
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
getWindow().setAttributes(params);
}
我最后发现有问题的代码了,需要重点关注的:
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
高度设置成整个window的高度,于是bug就来了。当高度设置成全部的时候,整个window都是你的自定义Dialog,所以不存在Dialog外部区域,就是说setCanceledOnTouchOutside和setCancelable有效的区域不存在。
解决方案
代码如下所示:
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
只要把高度改成包裹内容就可以了。记录这个意外的bug,希望对看到这篇文章的小伙伴们有帮助。