关键: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); }
|