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

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

<style name="bottom_dialog" parent="Theme.AppCompat.Dialog">
        <item name="android:windowBackground">@color/transparent
    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内可以完美适应输入框。

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



    

    

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

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

你可能感兴趣的:(Android)