我试图在AlertDialog背后有一个模糊的背景。该过程如下所示:截取活动的屏幕截图并将其模糊并将其保存到位图。然后将此位图转换为drawable。然后我使用这行代码renameDialog.getWindow().setBackgroundDrawable(draw);
设置警报窗口的可绘制背景
问题是,即使我通过指定布局参数强制某个位置,对话框也只会显示在屏幕顶部。我注意到,如果我将setBackgroundDrawable
更改为setBackgroundDrawableResource
并为其提供现有的drawable,则会在指定位置显示该对话框。
需要做什么才能使setBackgroundDrawable
与对话框的指定位置一起使用?
谢谢!
AlertDialog renameDialog = new AlertDialog.Builder(this).create();
LayoutInflater factory = LayoutInflater.from(this);
deleteDialogView = factory.inflate(R.layout.dialog_rename_playlist, null);
//Getting Blurry screenshot to display it behind dialog
Bitmap backgroundScreenshot = Utils.takeScreenShot(PlaylistActivity.this);
Bitmap blurryBackground = Utils.getBlurredBitmap(backgroundScreenshot, 30);
WindowManager.LayoutParams wmlp = renameDialog.getWindow().getAttributes();
wmlp.gravity = Gravity.CENTER_VERTICAL;
wmlp.x= 100;
wmlp.y= 100;
final Drawable draw=new BitmapDrawable(getResources(), blurryBackground);
renameDialog.getWindow().setBackgroundDrawable(draw);
renameDialog.getWindow().setAttributes(wmlp);
renameDialog.setView(deleteDialogView, 0, 0, 0, 0);
renameDialog.show();
答案 0 :(得分:1)
通过将窗口背景设置为屏幕大小的drawable,您可以使窗口变为全屏尺寸。在这种情况下,Gravity.CENTER_VERTICAL
无法执行任何操作。用Gravity.CENTER_VERTICAL
计算就像这样:
spacingAtTop = spacingAtBottom = (containerHeight - contentHeight) / 2
设置背景后,contentHeight
等于containerHeight
。
如果可能,请发布R.layout.dialog_rename_playlist
。
有一件事你可以尝试而不会改变太多:
将R.layout.dialog_rename_playlist
的内容包含在FrameLayout
内,其高度设置为match_parent
。然后,R.layout.dialog_rename_playlist
的当前父级(称为oldParent)的高度应设置为wrap_content
,layout_gravity
设置为center_vertical
。这至少应该将您的内容带到中心。但它无法解决您的定位问题。
更强大的方法是使用FrameLayout
作为Activity/Fragment
的父容器。在显示对话框之前,请截取屏幕截图,将其模糊,然后将其设置为此FrameLayout's
前景。使您的AlertDialog's
背景透明,您应该获得相同的效果。
答案 1 :(得分:0)
一堆猜测
wmlp.gravity = Gravity.CENTER_VERTICAL; //put me in the middle vertically
wmlp.x= 100; //sorry i have no effect
wmlp.y= 100;//dude!! you are wasting lines; i have no effect
这样做
wmlp.gravity = Gravity.FILL; // i grow up when needed
wmlp.x= 100; // now i am useful
wmlp.y= 100; //dude!! you are wasting lines; use wmlp.y = wmlp.x = 100
希望有所帮助
答案 2 :(得分:0)
我认为您可以使用PopupWindow