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);

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

相关推荐
rocpp9 小时前
Android 相册选择与拍照接入实践:MediaStore 分页、权限适配与 FileProvider
android
Flynt10 小时前
升级Flutter 3.44,我踩了HCPP和AGP 9的坑
android·flutter·dart
白色牙膏11 小时前
Cocos Creator 2.4.x 接入 AdMob 插件的迁移实践
android
我命由我1234512 小时前
C++ - 面向对象 - 常成员函数
android·java·linux·c语言·开发语言·c++·算法
tryqaaa_13 小时前
学习日志(四)【php反序列化魔术方法以及pop构造配实战】
android
Java小学生丶14 小时前
记录一下我的 Gradle 开发环境配置过程
android·java·gradle·maven·安卓
问心无愧051315 小时前
ctf show web 入门256
android·前端·笔记
霸道流氓气质15 小时前
MySQL 索引设计实战指南
android·数据库·mysql
R语言爱好者16 小时前
叠氮酸介绍
android
方白羽16 小时前
Android WebView 中实现第三方 QQ 登录的架构与流程详解
android·app