在屏幕的任何位置显示AlertDialog


Answers:


255

在各种帖子中搜索后,我找到了解决方案。

该代码发布在下面:

private CharSequence[] items = {"Set as Ringtone", "Set as Alarm"};
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setItems(items, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int item) {

            if(item == 0) {

            } else if(item == 1) {

            } else if(item == 2) {

            }
        }
    });

     AlertDialog dialog = builder.create();
     dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
     WindowManager.LayoutParams wmlp = dialog.getWindow().getAttributes();

 wmlp.gravity = Gravity.TOP | Gravity.LEFT;
 wmlp.x = 100;   //x position
 wmlp.y = 100;   //y position

 dialog.show();

x位置的值是从左到右的像素。对于y,位置值是从下到上。


1
您还可以创建一个自定义警报对话框。我最近才这样做,然后必须获取显示的宽度和高度,然后根据这些值的百分比设置X和Y,这样布局就可以很好地缩放。 developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc 2011年

15
它有效,但是我必须添加:WMLP.gravity = Gravity.TOP | Gravity.LEFT; 否则,将x和y值用作距屏幕中心的偏移量。
BoD 2012年

1
只是分享经验:仅当对话框可以完全显示在屏幕上时,以上代码才有效。例如,如果新的y坐标太大,则对话框将移动到屏幕上仍显示整个对话框的最低位置。这里最棘手的部分是,布局参数的x和y值从此不再显示对话框窗口左上角的坐标,并且不能用于计算窗口的相对运动,例如当对MotionEvent做出反应。
Nantoka 2013年

1
就像魅力..一样工作,但无需wmlp.x = 100; //x position wmlp.y = 100;设置重力wmlp.gravity = Gravity.TOP | Gravity.LEFT;就够了
Ajay Mistry

14

例如,如果您想将进度对话框往下移一点,而不是设置exakt像素位置,那么这就足够了:

progressDialog.getWindow().getAttributes().verticalMargin = 0.2F;

我想给重心为中心的警报对话框留10 dp的余量。我可以使用上面的代码吗?如果没有,那么还有其他方法吗?
阿曼·维尔玛

5

为了使设置生效,我添加了以下代码
dialog.getWindow().setAttributes(wmlp);

在gypsicoder的答案中更改wmlp的值后,或者wmlp的设置在我的测试中没有生效。


0

这些答案将移动AlertDialog的位置,但是,显示的对话框的位置还将包括对话框周围的填充。

如果要摆脱这种填充(例如,使对话框与屏幕底部齐平),则还需要覆盖styles.xml中的默认AlertDialog样式,以将windowBackground设置为null,如下所示:

<resources>
    <!--  Example app theme - mine uses the below -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:alertDialogTheme">@style/MyDialogTheme</item>
    </style>

    <style name="MyDialogTheme" parent="Theme.AppCompat.Light.Dialog.Alert">
    <!-- Full width -->
        <item name="android:layout_width">fill_parent</item>

    <!-- Null window background kills surrounding padding -->
        <item name="android:windowBackground">@null</item>
        <item name="android:windowNoTitle">true</item>

     </style>
</resources> 

以及按照接受的答案中所述设置Window.LayoutParameters。

@David Caunt特别鸣叫,答案是:删除边框,从Dialog填充以完成此图片。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.