如何设置对话框的位置?

8
我制作了一个自定义对话框。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="myBackgroundStyle"
        parent="@android:style/Theme.Translucent.NoTitleBar" />
</resources>

screenshot

Dialog dialog = new Dialog(this, R.style.myBackgroundStyle);
dialog.setContentView(R.layout.dialog);

dialog.show();

WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.y = 225; params.x = 225;
params.gravity = Gravity.TOP | Gravity.LEFT;       
dialog.getWindow().setAttributes(params); 

但问题是它出现在左上角,我找不到一个放置它的方法。 params.y = 225; params.x = 225;似乎没有影响。

有什么想法吗?


编辑: 如果我像这样拥有xml(style / Theme.Dialog),那么参数和位置就可以正常工作,但会出现模态阴影。有办法去掉它吗?

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="myBackgroundStyle" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">false</item>
    </style>
</resources>
5个回答

8
尝试创建一个新的参数集:
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.y = 225; params.x = 225;
params.gravity = Gravity.TOP | Gravity.LEFT;       
dialog.getWindow().setAttributes(params);

编辑:如果您想保留窗口的属性,可以尝试将此作为第二行添加:

params.copyFrom(dialog.getWindow().getAttributes());

然而,请注意copyFrom方法完全没有文档说明,所以我不知道它是否像它听起来的那样。

不行,似乎不能与“Theme.Translucent.NoTitleBar”一起使用。 - Roger

4

2

In the above code the line...

dialog.show();

应该出现在之后

WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.y = 225; params.x = 225;
params.gravity = Gravity.TOP | Gravity.LEFT;       
dialog.getWindow().setAttributes(params); 
...

看起来你是先展示对话框,然后在对话框已经绘制到屏幕上之后再设置 x、y 坐标。

2

不完全是,更像是在“Theme.Translucent.NoTitleBar”中。也就是说,如果它是Theme.Dialog,那么参数可以正常工作,但是我会得到遮罩阴影。 - Roger
不是这样。该链接是关于从标题栏中删除小阴影,而我需要删除模型遮罩(即对话框后面整个屏幕变暗)。 - Roger

0

只需删除 params.gravity = Gravity.TOP | Gravity.LEFT; 就可以了。我已经尝试过了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接