Diyalogun ekran android üzerindeki konumunu değiştirme


111

Bir basit yapılmış AlertDialogbenim de Aktivitesi :

View view = layoutInflater.inflate(R.layout.my_dialog, null);
AlertDialog infoDialog = new AlertDialog.Builder(MyActivity.this)
                    .setView(view)  
                    .create();

infoDialog.show();

Yukarıdaki kodla, diyalog ekranın ortasında (yaklaşık) gösterilir.

Merak ediyorum, iletişim kutusunun konumunu en üstteki İşlem Çubuğunun hemen altında görünmesi için nasıl özelleştirebilirim? (Bu iletişim kutusundaki yerçekimini veya başka bir şeyi değiştirmenin bir yolu var mı?) Ve koduma göre nasıl yapılır?


Bize my_dialog xml düzeninizi gösterirseniz, muhtemelen değişiklik yapmanıza yardımcı olabiliriz.
Alan Moore


@ Ankit, yorumunuzu cevap olarak verebilir misiniz, çünkü bağlantınızı kontrol ettikten sonra sorunum çözülür.
Leem.fin

Yanıtlar:


235

Ekranın altındaki iletişim kutusunu göstermek için bu kodu kullandım:

Dialog dlg = <code to create custom dialog>;

Window window = dlg.getWindow();
WindowManager.LayoutParams wlp = window.getAttributes();

wlp.gravity = Gravity.BOTTOM;
wlp.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
window.setAttributes(wlp);

Bu kod ayrıca, ihtiyacınız olursa android'in iletişim kutusunun arka planını karartmasını engeller. İletişim kutusunu hareket ettirmek için yerçekimi parametresini değiştirebilmelisiniz.


Selam teşekkür ederim. Yerçekimini en üste ayarladım, iletişim kutusu ekranın üst kısmına gider, ancak aynı zamanda işlem çubuğumu da kapladı, iletişim kutusunun üstte olmasını isterdim ama işlem çubuğunun hemen altında ... bunu nasıl ayarlayabilirim?
Leem.fin

6
Ekrandaki iletişim kutusunun konumunu açıkça ayarlamak için wlp.xve wlp.yalanlarını kullanmayı deneyebilirsiniz . Ben kendim denemedim ama muhtemelen işe yaramalı.
Aleks G

4
Karartmanın temizlenmesi benim için işe yaramadı (gerisi bir cazibe gibi çalıştı). Karartmaya başka bir noktada şu şekilde bir çözüm buldum: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck

@AleksG deilog'u merkezde tutarak loş arka plan rengini değiştirmenin bir yolu var mı? WindowIsFloating = false öğesini dailog stiline ayarlamayı denedim. Ama dailog'u en üste hizalayın!
Kshitij

@Kshitij Diyaloğu merkezde tutmak istiyorsanız, bu koda ihtiyacınız yoktur - varsayılan olarak Android merkezleri diyalogları. Loş rengi değiştirmeye gelince, bu tema tarafından kontrol edilir. Uygulamanıza karşılık gelen temayı ekleyerek onu geçersiz kılabilirsiniz. Yine de hiç denemedim.
Aleks G

23
private void showPictureialog() {
    final Dialog dialog = new Dialog(this,
            android.R.style.Theme_Translucent_NoTitleBar);

    // Setting dialogview
    Window window = dialog.getWindow();
    window.setGravity(Gravity.CENTER);

    window.setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    dialog.setTitle(null);
    dialog.setContentView(R.layout.selectpic_dialog);
    dialog.setCancelable(true);

    dialog.show();
}

yerçekimi ve düzen parametrelerine göre iletişiminizi özelleştirebilirsiniz, yerçekimi ve düzen parametresini ihtiyacınıza göre


1
Selam teşekkür ederim. Yerçekimini en üste ayarladım, iletişim kutusu ekranın üst kısmına gider, ancak aynı zamanda işlem çubuğumu da kapladı, iletişim kutusunun üstte olmasını isterdim ama işlem çubuğunun hemen altında ... bunu nasıl ayarlayabilirim?
Leem.fin


'FILL_PARENT'kullanımdan kaldırıldı. API
21'deyim

1
@ fWd82 öyleyse onun yerine 'MATCH_PARENT' kullanın
William

13

Bu kod parçacığını burada @gypsicoder kodundan buldum

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.


10

Benim için bu, diyaloğumu tam olarak seçildiği metin görünümünün altında bir yere yerleştirmeye çalıştığım yerde oldukça iyi sonuç verdi.

public void setPosition(int yValue) {
    Window window = getWindow();
    WindowManager.LayoutParams param = window.getAttributes();
    param.gravity = Gravity.TOP | Gravity.CENTER_HORIZONTAL;
    param.y = yValue;
    window.setAttributes(param);
    window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
}

10

Yeni BottomSheetDialog:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);    
dialog.setContentView(YourView);

dialog.show();

5

sadece bunu kodunuza ekleyin:

dialog.getWindow().setGravity(Gravity.BOTTOM);


1

Diyalog etkinliğim için şunu kullandım:

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;

1

bu yöntemi kullanıyorum

 @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog dialog = new Dialog(getActivity());
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    Window window = dialog.getWindow();
    WindowManager.LayoutParams wlp = window.getAttributes();
    wlp.gravity = Gravity.BOTTOM;
    dialog.setContentView(R.layout.dialog_droppoint);
    dialog.show();
    window.setAttributes(wlp);
    return dialog;

}

0

bottomSHeet kullanın:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();

0
public class MyDialogFragment extends DialogFragment{
    protected void setDialogGravity(int gravity) {
        Dialog dialog = getDialog();
        if (dialog != null) {
            Window window = dialog.getWindow();
            if (window != null) {
                WindowManager.LayoutParams params = window.getAttributes();
                params.width = WindowManager.LayoutParams.MATCH_PARENT;
                params.height = WindowManager.LayoutParams.MATCH_PARENT;
                params.horizontalMargin = 0;
                params.gravity = gravity;
                params.dimAmount = 0;
                params.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
                window.setAttributes(params);
            }
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreateView(inflater,container,savedInstanceState);

        return inflater.inflate(R.layout.my_dialog, null);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
                super.onViewCreated(view, savedInstanceState);
                setDialogGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
    }
}
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.