美文网首页程序员
Dialog 外部透明背景与宽高固定

Dialog 外部透明背景与宽高固定

作者: lipyhui | 来源:发表于2019-06-28 16:16 被阅读0次

    一、说明

      笔记主要是记录一些本人在开发当中的学习和使用笔记。笔记内容包含一些本人觉得重要的知识点、本人易犯的错误等。
      由于本人水平有限,其中出现的错误或者不合理的地方望各位读者多多包含,并指出其中不合理和错误的地方,以便我来修改正。谢谢!

    二、笔记时间

      2019年06月28日

    三、简述

      本文主要记录如何设置 Dialog宽高;还有Dialog透明问题。

    四、详情

    1、Dialog 外部透明背景

      当我们设置 AlertDialog windowBackground 透明时,发现透明是没问题,但是边框阴影怎么也去不掉。于是我想把 AlertDialog 改成 Dialog,结果意外还是出现了,用 Dialog 时果断边框阴影没有了。不管是为啥,反正问题是没有了,此处做一下记录,以免下次继续踩坑。代码如下:

        <style name="NoBackGroundDialog" parent="@android:style/Theme.Holo.Light.Dialog">
            <item name="android:windowBackground">@android:color/transparent</item>
            <item name="android:windowNoTitle">true</item>
            <item name="android:windowIsFloating">true</item>
            <item name="android:backgroundDimEnabled">false</item>
        </style>
    
    public class AboutDialog extends Dialog {
    
        protected AboutDialog(Context context, int theme) {
            super(context, theme);
        }
    
        protected AboutDialog(Context context) {
            super(context);
        }
    
        public static class Builder {
    
            private Activity mContext;
            private AboutDialog mAboutDialog;
    
            public Builder(Activity context) {
                if (null == context || context.isFinishing())
                    return;
            }
    
            @SuppressLint("Override")
            public AboutDialog create() {
                mAboutDialog = new AboutDialog(mContext, R.style.NoBackGroundDialog);
                View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_about, null);
    
                mAboutDialog.setContentView(view);
                mAboutDialog.setCancelable(false);
                mAboutDialog.setCanceledOnTouchOutside(true);
                mAboutDialog.show();
                return mAboutDialog;
            }
        }
    }
    

    2、Dialog 固定宽高

      在实际开发中,我发现另外一个问题,就是我们在布局里面设定死了宽高,可结果用 Dialog 展示时,这个设定的宽高没有任何作用。这里又两只处理方式:

    • 给布局再包裹一层,把宽高设置到子布局里面。不过这样的问题是多了一层布局
    • Java 代码中修改 Window 的 LayoutParams

      把宽高设定到子布局里面,这个不用多说。下面主要说说 Java 修改 LayoutParams 的方式。不多说直接贴代码:

        Window window = mAboutDialog.getWindow();
        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = (int) mContext.getResources().getDimension(R.dimen.about_width);
        lp.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
        lp.y -= ContextCompat.getDrawable(mContext, R.drawable.icon_mascot_selected).getMinimumHeight();
        window.setAttributes(lp);
    

      代码中我们还给 LayoutParams 设置了 y 的值,这个目的是设置 Dialog 的显示位置,代码中是让 Diaolg 的显示位置向上偏移了一个图片的高度。
      \color{red}{注:通过 LayoutParams 设置固定 Dialog 宽高,一定要在 Dialog show 之后设置,不然无效。}

      下面贴一下我 Dialog 的完整代码:

    public class AboutDialog extends Dialog {
    
        protected AboutDialog(Context context, int theme) {
            super(context, theme);
        }
    
        protected AboutDialog(Context context) {
            super(context);
        }
    
        public static class Builder {
    
            private Activity mContext;
            private AboutDialog mAboutDialog;
    
            public Builder(Activity context) {
                if (null == context || context.isFinishing())
                    return;
            }
    
            @SuppressLint("Override")
            public AboutDialog create() {
                mAboutDialog = new AboutDialog(mContext, R.style.NoBackGroundDialog);
                View view = LayoutInflater.from(mContext).inflate(R.layout.dialog_about, null);
    
                mAboutDialog.setContentView(view);
                mAboutDialog.setCancelable(false);
                mAboutDialog.setCanceledOnTouchOutside(true);
                mAboutDialog.show();
    
                Window window = mAboutDialog.getWindow();
                WindowManager.LayoutParams lp = window.getAttributes();
                lp.width = (int) mContext.getResources().getDimension(R.dimen.about_width);
                lp.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
                lp.y -= ContextCompat.getDrawable(mContext, R.drawable.icon_mascot_selected).getMinimumHeight();
                window.setAttributes(lp);
    
                return mAboutDialog;
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:Dialog 外部透明背景与宽高固定

        本文链接:https://www.haomeiwen.com/subject/ymqecctx.html