Tampilkan AlertDialog di sembarang posisi layar

106

Saat kami menampilkan AlertDialog di android, ini ditampilkan di tengah layar. Apakah ada cara untuk mengubah posisi?

gypsicoder.dll
sumber

Jawaban:

255

Setelah mencari di berbagai postingan saya menemukan solusinya.

Kode diposting di bawah ini:

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();

Di sini nilai posisi x adalah piksel dari kiri ke kanan. Untuk nilai posisi y dari bawah ke atas.

gypsicoder.dll
sumber
1
Anda juga dapat membuat dialog lansiran ubahsuaian. Saya baru saja melakukan ini dan kemudian harus mendapatkan lebar dan tinggi tampilan dan kemudian mengatur X dan Y berdasarkan persentase dari nilai-nilai itu, dengan cara itu tata letak diskalakan dengan baik. developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc
15
Ini berfungsi tetapi saya harus menambahkan ini: WMLP.gravity = Gravity.TOP | Gravity.LEFT; jika tidak, nilai x dan y digunakan sebagai offset dari tengah layar.
Direksi
1
Sekadar berbagi pengalaman: Kode di atas hanya berfungsi selama dialog dapat tetap berada di layar sepenuhnya. Misalnya, jika koordinat y baru terlalu besar, dialog akan dipindahkan ke posisi terendah di layar yang masih menampilkan dialog secara keseluruhan. Bagian yang sulit di sini adalah bahwa nilai x dan y dari parameter tata letak yang ditampilkan sejak saat itu tidak lagi koordinat sudut kiri atas jendela dialog dan tidak dapat digunakan untuk menghitung pergerakan relatif jendela misalnya ketika bereaksi terhadap MotionEvent.
Nantoka
1
bekerja seperti pesona .. tetapi tidak perlu mengatur wmlp.x = 100; //x position wmlp.y = 100;Anda, cukup atur gravitasi wmlp.gravity = Gravity.TOP | Gravity.LEFT;sudah cukup
Ajay Mistry
14

Jika Anda misalnya ingin memindahkan log kemajuan sedikit lebih jauh ke bawah, dan tidak mengatur posisi piksel yang tepat, maka ini sudah cukup:

progressDialog.getWindow().getAttributes().verticalMargin = 0.2F;
pgsandstrom
sumber
Saya ingin memberikan margin sekitar 10 dp ke dialog peringatan yang gravitasinya adalah pusat. Bisakah saya menggunakan kode di atas? Jika tidak, apakah ada cara lain untuk melakukan ini?
Aman Verma
5

Untuk membuat setting come info effect, saya menambahkan kode berikut
dialog.getWindow().setAttributes(wmlp);

setelah mengubah nilai wmlp dalam jawaban gypsicoder, atau pengaturan wmlp tidak diterapkan oleh pengujian saya.

juejiang
sumber
0

Jawaban ini akan memindahkan posisi AlertDialog, namun posisi dialog yang ditampilkan juga akan menyertakan padding di sekitar dialog.

Jika Anda ingin menyingkirkan padding ini (misalnya, untuk menempatkan dialog Anda rata di bagian bawah layar), Anda juga perlu mengganti gaya AlertDialog default di styles.xml Anda untuk menyetel windowBackground ke null, seperti itu :

<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> 

Serta mengatur Window.LayoutParameters seperti yang dijelaskan dalam jawaban yang diterima.

Teriakan khusus untuk @David Caunt yang jawabannya di: hapus batas, padding dari Dialog melengkapi gambar ini.

HappyKatz
sumber