程序员

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

2019-06-28  本文已影响0人  lipyhui

一、说明

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

二、笔记时间

  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 修改 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;
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读