实现Android Dialog(AlertDialog)弹窗并去掉边界

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:30   2193   0

关键:dialog.getWindow().setBackgroundDrawable(null);

写这个的原因是笔者有一个弹窗需求,但是不管怎么设置,都无法取消弹出的Dialog边界。

网上的各种方法也尝试了方法,包括获取窗口大小作为长宽:

        final Dialog dialog = new Dialog(context, R.style.style_dialog);
        dialog.setContentView(view);
        dialog.show();

        Window window = dialog.getWindow();
        window.setGravity(Gravity.BOTTOM);
        window.setWindowAnimations(R.style.dialog_animation);
        window.getDecorView().setPadding(0, 0, 0, 0);

        WindowManager.LayoutParams lp = window.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.height = WindowManager.LayoutParams.MATCH_PARENT
;
        window.setAttributes(lp); 
 

包括设置主题为NO_TITLE、FULL_SCREEN之类的都无法取消边界,如下(为了看是否真的有边框,先将弹窗设置为铺满):

这个边框的可恶之处不仅仅是在铺满时候会这样,当你设置弹窗大小时候,他同样是无法做到真实的大小:例如

WindowManager.LayoutParams p = dialog.getWindow().getAttributes();  //获取对话框当前的参数值
p.height = dp2px(context,400);
p.width = dp2px(context,300);
dialog.getWindow().setAttributes(p);
 

(dp2px是一个将dp转为px的方法,Java代码中只能用px嘛)实际上大小并不是宽300和高400。这就和UI设计上会有出入了。

也考虑过用自定义的Dialog来设置怎么怎么的,但是确实麻烦,而且估计也是不行。因为取消这些边框的关键是:

dialog.getWindow().setBackgroundDrawable(null);

就这一句的可以了。:)

可以看下源码

private void initFloatingWindow() {
    ...
    mWindow.setBackgroundDrawableResource(android.R.color.transparent);
<color name="transparent">#00000000</color>

/**
 * Change the background of this window to a Drawable resource. Setting the
 * background to null will make the window be opaque. To make the window
 * transparent, you can use an empty drawable (for instance a ColorDrawable
 * with the color 0 or the system drawable android:drawable/empty.)
 *
 * @param resId The resource identifier of a drawable resource which will
 *              be installed as the new background.
 */
public void setBackgroundDrawableResource(@DrawableRes int resId) {
    setBackgroundDrawable(mContext.getDrawable(resId));
}
 

这里可以看到,在Dialog中是默认设置了个透明的背景的(估计是为了方便人点击那些透明的地方以退出弹窗),源码注释中中也有说明:Setting the background to null will make the window be opaque.

所以,我们需要的是把后面那个透明的背景去掉:dialog.getWindow().setBackgroundDrawable(null)。

从而,在设置窗口大小时候让他拥有真实的大小。

顺便附上这个Dialog的写法:

AlertDialog dialog = new AlertDialog.Builder(context).create();

//layout_dialog为窗口的xml

View view = LayoutInflater.from(context).inflate(R.layout.layout_dialog, null);

//里面的控件就是一堆view.findViewById()了view.

dialog.show();
dialog.setCancelable(false);
setWindowSize(dialog,(Activity)context);

dialog.getWindow().setContentView(view);

/**
* 设置Dialog窗口的大小
*/
private void setWindowSize(Dialog dialog,Activity context) {
WindowManager.LayoutParams p = dialog.getWindow().getAttributes(); //获取对话框当前的参数值
p.height = dp2px(context,400);
p.width = dp2px(context,300);
dialog.getWindow().setAttributes(p);
//取消弹窗默认背景边框
dialog.getWindow().setBackgroundDrawable(null);

}

public int dp2px(Context context, float dpValue) {

final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP