AlertDialog'u ekranın herhangi bir konumunda göster


106

Android'de bir AlertDialog gösterdiğimizde, ekranın ortasında gösterilir. Pozisyonu değiştirmenin bir yolu var mı?

Yanıtlar:


255

Çeşitli yazılarda aradıktan sonra çözümü buldum.

Kod aşağıda yayınlanmıştır:

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

Burada x konumunun değeri soldan sağa pikseldir. Y konumu için değer, aşağıdan yukarıya doğrudur.


1
Ayrıca özel bir uyarı diyaloğu da oluşturabilirsiniz. Bunu kısa bir süre önce yaptım ve sonra ekran genişliğini ve yüksekliğini almak zorunda kaldım ve ardından X ve Y'yi bu değerlerin bir yüzdesine göre ayarlamak zorunda kaldım, bu şekilde düzen güzel bir şekilde ölçeklendi. developer.android.com/guide/topics/ui/dialogs.html#CustomDialog
Roloc

15
Çalışıyor ama şunu eklemem gerekiyor: WMLP.gravity = Gravity.TOP | Yerçekimi.LEFT; aksi takdirde x ve y değerleri, ekranın merkezinden ofsetler olarak kullanıldı.
BoD

1
Sadece deneyimi paylaşmak için: Yukarıdaki kod yalnızca iletişim kutusu tamamen ekranda kaldığı sürece çalışır. Örneğin, yeni y koordinatı çok büyükse, iletişim kutusu, tüm iletişim kutusunu gösteren ekranın en alt konumuna taşınır. Buradaki zor kısım, düzen parametrelerinin x ve y değerlerinin artık iletişim penceresinin sol üst köşesinin koordinatlarını göstermemesi ve örneğin pencerenin göreli hareketini hesaplamak için kullanılamamasıdır. MotionEvent'e tepki verme.
Nantoka

1
cazibe gibi çalışıyor .. ama ayarlamanıza wmlp.x = 100; //x position wmlp.y = 100;gerek yok sadece yerçekimini ayarlamak wmlp.gravity = Gravity.TOP | Gravity.LEFT;yeterli
Ajay Mistry

14

Örneğin, ilerleme diyalogunu biraz daha aşağı taşımak istiyorsanız ve exakt piksel konumunu ayarlamak istemiyorsanız, bu yeterlidir:

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

Yerçekimi merkezde olan uyarı diyaloğuna yaklaşık 10 dp'lik marj vermek istiyorum. Yukarıdaki kodu kullanabilir miyim? Değilse, bunu yapmanın başka bir yolu var mı?
Aman Verma

5

Ayarın bilgi efekti gelmesi için aşağıdaki kodu ekledim
dialog.getWindow().setAttributes(wmlp);

gypsicoder'ın cevabındaki wmlp değerini değiştirdikten sonra veya wmlp ayarı testim tarafından yürürlüğe girmiyor.


0

Bu yanıtlar, AlertDialog'un konumunu değiştirecektir, ancak görüntülenen iletişim kutusunun konumu, iletişim kutusunun etrafındaki dolguyu da içerecektir.

Bu dolgudan kurtulmak istiyorsanız (örneğin, diyaloğunuzu ekranın alt kısmına yaslamak için), windowBackground'u null olarak ayarlamak için styles.xml dosyanızdaki varsayılan AlertDialog stilini de geçersiz kılmanız gerekecektir. :

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

Kabul edilen yanıtta açıklandığı gibi Window.LayoutParameters'ı ayarlamanın yanı sıra.

@David Caunt'a özel seslendirme, cevabı: kenarlığı kaldır, Dialog'dan doldurma bu resmi tamamladı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.