AlertDialog 攻略 自定义宽度,改变灰色背景透明度

本文介绍如何在Android中使用AlertDialog实现全屏显示,并自定义灰色背景的透明度。通过设置style和自定义布局,可以解决Dialog宽度不填满屏幕的问题,同时在底部展示内容。通过修改特定属性,可以调整灰色覆盖层的透明度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在android项目中经常会遇到这样的需求,从底部弹出些选项之类的。实现起来有很多种方法,比如:popupwindow,或者干脆定义一个透明灰色背景的view充当cover,然后通过设置要显示内容的visibility属性及辅助动画来达到这样的效果。 但是,灰色的背景总是不能覆盖状态栏。而使用Dialog会达到全屏灰色背景的沉浸体验效果。但是,Dialog使用时宽度一般不是充满屏幕宽度的,我们接下来要解决这个问题。

<style name="bottom_dialog" parent="Theme.AppCompat.Dialog">
        <item name="android:windowBackground">@color/transparent</item>
    </style>

注意,windowBackground是显示内容区域的窗口的背景色,不是整个屏幕的背景色。 background也不能修改屏幕背景色,屏幕背景色可以通过下面的方式修改透明度。或者,自定义layout,并把layout高宽充满全屏幕,即可自己定义背景色。

使用上面的style,作为以后给AlertDialog的style。
我的需求是在屏幕底部显示内容,于是我定义BottomDialog.java:

public class BottomDialog {

    private AlertDialog alertDialog;

    public BottomDialog( AlertDialog alertDialog){
        this.alertDialog = alertDialog;
        if (null != alertDialog) {
            init();
        }
    }

    private void init(){
        Window window = alertDialog.getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_MASK_STATE);


    }

    public void show(){
        if (null != alertDialog){
            alertDialog.show();
            Window window = alertDialog.getWindow();
            WindowManager.LayoutParams layoutParams = window.getAttributes();
            window.setGravity(Gravity.BOTTOM);
            layoutParams.width = window.getWindowManager().getDefaultDisplay().getWidth();
            layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
            window.setAttributes(layoutParams);
        }
    }

    public void dismiss(){
        if (null != alertDialog){
            alertDialog.dismiss();
        }
    }
}

使用时:

if (commentDialog == null) {
                    commentDialog = new BottomDialog(
                            new AlertDialog.Builder(ArticleDetailActivity.this, R.style.bottom_dialog)
                                    .setView(v_comment_input)
                                    .create()
                    );
                }
                commentDialog.show();

这样dialog就可以宽度全屏显示在窗口底部了。而且dialog的view内可以完美适应输入框。

如果其他区域的透明灰色覆盖层不符合你的需求:

<style name="bottom_dialog_08" parent="bottom_dialog">
        <item name="android:backgroundDimAmount">0.8</item>
    </style>

    <style name="bottom_dialog_06" parent="bottom_dialog">
        <item name="android:backgroundDimAmount">0.6</item>
    </style>

    <style name="bottom_dialog_04" parent="bottom_dialog">
        <item name="android:backgroundDimAmount">0.4</item>
    </style>

修改android:backgroundDimAmount属性,即可获取不同的透明度。

另外,直接继承“Theme.AppCompat.DialogWhenLarge”样式,应该不需要再自定义宽度就能全屏。但是该style没有透明灰色的覆盖层,应该能通过加一个name="android:backgroundDimEnabled" true解决。如果帮你解决了问题,可以通过留言通知我,谢谢。

<style name="bottom_dialog_08" parent="bottom_dialog">
        <item name="android:backgroundDimAmount">0.8</item>
        <item name="android:backgroundDimEnabled">true</item>
    </style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值