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

简介: 在Android开发中,Dialog和DialogFragment可通过设置`Window`的`backgroundDimAmount`来控制背景变暗,突出对话框。在DialogFragment的`onCreateDialog`或`onViewCreated`中,获取`Dialog`的`Window`,设置`LayoutParams.dimAmount`(例如0.5f)并添加`FLAG_DIM_BEHIND`标志。要动态调整,可保存`LayoutParams`并在需要时更新。对于Dialog,创建时直接设置同样属性。还可以通过定义主题样式设置背景模糊程度。

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点

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

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

DialogFragment

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

DialogFragment 中设置 backgroundDimAmount

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 并在需要时更新它:

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

MyDialogFragment dialogFragment = new MyDialogFragment();
dialogFragment.show(getSupportFragmentManager(), "MyDialog");

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

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

Dialog

Dialog 中设置 backgroundDimAmount

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

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

<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的话就是完全看不到背景


欢迎关注我的公众号AntDream查看更多精彩文章!

目录
相关文章
|
5月前
|
XML Android开发 数据格式
Android 中如何设置activity的启动动画,让它像dialog一样从底部往上出来
在 Android 中实现 Activity 的对话框式过渡动画:从底部滑入与从顶部滑出。需定义两个 XML 动画文件 `activity_slide_in.xml` 和 `activity_slide_out.xml`,分别控制 Activity 的进入与退出动画。使用 `overridePendingTransition` 方法在启动 (`startActivity`) 或结束 (`finish`) Activity 时应用这些动画。为了使前 Activity 保持静止,可定义 `no_animation.xml` 并在启动新 Activity 时仅设置新 Activity 的进入动画。
147 12
|
6月前
|
开发工具 Android开发
Android 代码自定义drawble文件实现View圆角背景
Android 代码自定义drawble文件实现View圆角背景
196 0
|
6月前
|
XML Java Android开发
Android RecyclerView用代码动态设置item的selector
Android RecyclerView用代码动态设置item的selector
48 0
|
7月前
|
XML Java Android开发
android背景颜色渐变及改变title颜色
android背景颜色渐变及改变title颜色
60 4
|
7月前
|
XML Java Android开发
如何美化android程序:自定义ListView背景
如何美化android程序:自定义ListView背景
69 2
|
7月前
|
XML Java Android开发
Android控件动态使用 (转)
Android控件动态使用 (转)
42 1
|
7月前
|
Java Android开发 Kotlin
Android Dialog 弹出时,隐藏 navigation bar
Android Dialog 弹出时,隐藏 navigation bar
135 1
|
6月前
|
Java 机器人 Linux
01. 【Android教程】系统背景及结构概述
01. 【Android教程】系统背景及结构概述
49 0
|
7月前
|
Android开发
Android热补丁动态修复实践,腾讯&字节&网易&华为Android面试题分享
Android热补丁动态修复实践,腾讯&字节&网易&华为Android面试题分享
|
7月前
|
XML Android开发 数据格式
android 9 Systemui 动态隐藏导航栏
android 9 Systemui 动态隐藏导航栏
224 0