Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android中如何动态的调整Dialog的背景深暗

Android中如何动态的调整Dialog的背景深暗

作者头像
AntDream
发布于 2024-06-24 12:19:34
发布于 2024-06-24 12:19:34
65600
代码可运行
举报
运行总次数:0
代码可运行

Android 开发中,当你使用 Dialog 或 DialogFragment 时,可以通过设置 Window 的背景变暗来突出它的可见性。这个效果是通过 dimAmount 属性来控制的。

那我们怎么动态设置dimAmount呢?

DialogFragment

假设你正在使用 DialogFragment,那么你可以在 onCreateDialogonViewCreated 方法中配置 Dialog 的窗口属性。

DialogFragment 中设置 dimAmount

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        Window window = dialog.getWindow();

        if (window != null) {
            WindowManager.LayoutParams layoutParams = window.getAttributes();
            layoutParams.dimAmount = 0.5f; // 设置dimAmount为0.5,即背景变得半透明
            window.setAttributes(layoutParams);
            window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        }

        return dialog;
    }

    // 如果你的DialogFragment使用的是布局文件,需要在onViewCreated中调用上面的代码
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Window window = getDialog().getWindow();

        if (window != null) {
            WindowManager.LayoutParams layoutParams = window.getAttributes();
            layoutParams.dimAmount = 0.5f; // 设置dimAmount为0.5,即背景变得半透明
            window.setAttributes(layoutParams);
            window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        }
    }
}
动态调整 dimAmount

如果你需要在应用运行时根据某些条件动态调整 dimAmount,可以通过保存 WindowManager.LayoutParams 并在需要时更新它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyDialogFragment extends DialogFragment {

    private WindowManager.LayoutParams layoutParams;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        Window window = dialog.getWindow();

        if (window != null) {
            layoutParams = window.getAttributes();
            layoutParams.dimAmount = 0.5f; // 初始设置
            window.setAttributes(layoutParams);
            window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        }

        return dialog;
    }

    public void updateDimAmount(float dimAmount) {
        if (layoutParams != null) {
            layoutParams.dimAmount = dimAmount;
            if (getDialog() != null && getDialog().getWindow() != null) {
                getDialog().getWindow().setAttributes(layoutParams);
            }
        }
    }
}

然后你可以通过调用 updateDimAmount 来动态调整 dimAmount

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "MyDialog");

// 动态调整dimAmount
dialogFragment.updateDimAmount(0.8f); // 将dimAmount调整为0.8

这样你就可以在不同情况下动态调整 Dialog 的 dimAmount 了。

Dialog

Dialog 中设置 dimAmount

如果你直接使用 Dialog 而不是 DialogFragment,你可以在创建 Dialog 时设置 dimAmount

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dialog dialog = new Dialog(context);
dialog.setContentView(R.layout.dialog_layout);
Window window = dialog.getWindow();

if (window != null) {
    WindowManager.LayoutParams layoutParams = window.getAttributes();
    layoutParams.dimAmount = 0.5f; // 设置dimAmount为0.5,即背景变得半透明
    window.setAttributes(layoutParams);
    window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}

dialog.show();

静态的方式

静态的方式也就是创建Dialog时直接设置主题theme

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<style name="MyDialogTheme" parent="@style/Theme.Design.BottomSheetDialog" >
     <item name="android:windowIsFloating">false</item>
     <item name="android:backgroundDimAmount">0.5</item>
     <item name="android:backgroundDimEnabled">true</item>
     <item name="android:windowFullscreen">true</item>
     <item name="android:windowContentOverlay">@null</item>
 </style>

需要注意的是,这个backgroundDimAmount的数值越接近1,则背景越黑,如果是1的话就是完全看不到背景。

作者介绍

中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机

越努力越幸运,加油💪,一起遇见更好的自己

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AntDream 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android 撸起袖子,自己封装 DialogFragment
DialogFragment 在 Android 3.0 时被引入,是一种特殊的 Fragment,用于在 Activity 的内容之上显示一个静态的对话框。例如:警告框、输入框、确认框等。
developerHaoz
2018/08/20
1.9K0
DialogFragment踩坑记
DialogFragment推出来已经很久了,网上相关的文档一大堆,但是稍微不注意,还是会踩坑,本篇基于自身经历总结
韦东锏
2021/09/29
2.4K0
DialogFragment踩坑记
使用这个,自定义AlertDialog在你手里都不是问题
最近一直在搞自定义的AlertDialog,先贴一下图。 输入图片说明 输入图片说明 输入图片说明 这几种都是自定义的AlertDialog,还支持从Service弹出。好了,话不多说,看使用方法:
Xiaolei123
2018/06/28
1.1K0
Android必知必会-获取View坐标和长宽的时机
版权声明:本文为[他叫自己Mr.张]的原创文章,转载请注明出处,否则禁止转载。 https://micro.blog.csdn.net/article/details/51396838
他叫自己MR.张
2019/07/01
1.2K0
Android必知必会-获取View坐标和长宽的时机
android 自定义登陆对话框基类封装,且随着软键盘的弹起自动移动位置
像对话框这种常用的组件,用过一次最好做个封装。再次用到时就很简单啦。直接拿过来复用即可。
杨永贞
2020/12/01
8110
android 自定义登陆对话框基类封装,且随着软键盘的弹起自动移动位置
Android 必知必会 - DialogFragment 实现类似 PopupWindow 效果
版权声明:本文为[他叫自己Mr.张]的原创文章,转载请注明出处,否则禁止转载。 https://micro.blog.csdn.net/article/details/72834008
他叫自己MR.张
2019/07/01
1.9K0
Android 必知必会 - DialogFragment 实现类似 PopupWindow 效果
DialogFragment 使用
通过继承DialogFragment并且实现它的onCreateDialog(Bundle savedInstanceState)方法来创建一个DialogFragment,这个方法返回的是一个Dialog,意味着我们需要创建一个AlertDialog,并返回。
Yif
2019/12/26
1.8K0
Android Dialog 宽度占满全屏
关于如何自定义设置 Dialog 的大小,以及如何让宽度占满整个屏幕,其实是一个老生常谈的内容了,特别是对于很多新手来说。关于这方面的内容网上一搜一大把。我也看了一下,大多数是互相抄袭。来来回回就是那么几句代码。真实的运行结果往往并不是占满屏幕。这篇文章是把很多常见的情况都举例了。我们先看 Dialog 占满屏的效果,好了下面一步一步看,如果不想看过程可以直接跳过看总结。
开发者
2019/12/26
3.9K0
Android Dialog 宽度占满全屏
Android 必知必会 - DialogFragment 使用总结
Android 官方推荐使用 DialogFragment 来代替 Dialog ,可以让它具有更高的可复用性(降低耦合)和更好的便利性(很好的处理屏幕翻转的情况)。
他叫自己MR.张
2019/07/01
4.6K0
相关推荐
Android 撸起袖子,自己封装 DialogFragment
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验