Tampilkan AlertDialog di sembarang posisi layar


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.


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;

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.