Android解决Dialog触碰外面不能自动关闭问题

Android解决Dialog触碰外面不能自动关闭问题,其实也就是解决dialog.setCanceledOnTouchOutside(true) 不生效问题

为什么设置了dialog.setCanceledOnTouchOutside(true) 会不生效呢?

问题根源在styles文件中定义android:windowIsFloating=false导致:

XML 复制代码
    <!-- 底部弹出日期选择窗口Dialog样式. -->
    <style name="BottomDialog" parent="Theme.AppCompat.Dialog">
        
        <item name="android:windowIsFloating">false</item>
    </style>

android:windowIsFloating 表示Dialog是否浮现在activity之上,

当将windowIsFloating设置为false时对话框默认将使用全屏.因此没有外部区域可以点击取消,导致setCanceledOnTouchOutside(true)会失效

当将windowIsFloating设置为true时,触碰dialog区域外可以自动关闭,但是match_parent属性无效,不会自动扩展宽度以填充屏幕, 这将导致contentView总是将内容包装成尽可能小的内容。

所以:这里 建议将其设置为false后手动将Dialog窗口布局更新为MATCH_PARENT 问题即可解决

定义一个java方法:
java 复制代码
    //解决dialog.setCanceledOnTouchOutside(true) 不生效问题
    public void setDialogTouchOutsideCloseable(Dialog dialog, int gravity) {
        Window window = dialog.getWindow();
        WindowManager.LayoutParams params = window.getAttributes();
        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
        params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
        window.setAttributes(params);
        window.setGravity(gravity);
    }

使用:

java 复制代码
setDialogTouchOutsideCloseable(dialog,Gravity.BOTTOM);

作者原创文章,转载请注明出处!

相关推荐
普通网友12 小时前
Android Jetpack 架构组件最佳实践之“网抑云”APP
android·架构·android jetpack
普通网友12 小时前
原创_Android Jetpack Compose 最全上手指南
android·android jetpack
FDoubleman12 小时前
Android Jetpack之Compose入门(一)
android·android jetpack
普通网友12 小时前
Android Jetpack从入门到精通,干货满满
android·android jetpack
子云心12 小时前
Android Jetpack 系列(七)App Startup 启动优化
android·android jetpack·jetpack·initializer·startup·appstartup
嫩嫩的猿12 小时前
android jetpack compose Model对象更新变量 UI不更新、不刷新问题
android·ui·android jetpack
普通网友12 小时前
Android Jetpack 之 LifeCycle 组件_android 自定义view lifecycle
android·gitee·android jetpack
_codemonster13 小时前
数据库字符集编码问题
android·数据库·oracle
Pika18 小时前
深入浅出Compose HitTest 机制
android·android jetpack