画面の任意の位置にAlertDialogを表示する


回答:


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

15
それは動作しますが、これを追加する必要がありました:WMLP.gravity = Gravity.TOP | Gravity.LEFT; それ以外の場合は、xとyの値が画面の中心からのオフセットとして使用されていました。
2012年

1
エクスペリエンスを共有するためだけに:上記のコードは、ダイアログが画面上に完全にとどまる場合にのみ機能します。たとえば、新しいy座標が大きすぎる場合、ダイアログは画面全体で最も低い位置に移動され、ダイアログ全体が表示されます。ここで注意が必要なのは、レイアウトパラメータのx値とy値がそれ以降、ダイアログウィンドウの左上隅の座標を示さなくなり、ウィンドウの相対移動を計算するために使用できなくなった場合などです。 MotionEventに反応する。
ナントカ

1
魅力のように動作しwmlp.x = 100; //x position wmlp.y = 100;ますが、重力を設定するだけwmlp.gravity = Gravity.TOP | Gravity.LEFT;で十分です
Ajay Mistry

14

たとえば、progressdialogを少し下に移動し、exaktピクセル位置を設定しない場合は、これで十分です。

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

重力が中心のアラートダイアログに約10 dpのマージンを与えたい。上記のコードを使用できますか?そうでない場合、これを行う他の方法はありますか?
Aman Verma

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への特別な呼びかけ:境界線を削除し、ダイアログからのパディングでこの画像を完成させました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.