Mengubah posisi Dialog di layar android


111

Saya membuat sederhana AlertDialogdalam Aktivitas saya :

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

infoDialog.show();

Dengan kode di atas, dialog muncul di (tentang) tengah layar.

Saya bertanya-tanya, bagaimana cara menyesuaikan posisi dialog agar ditampilkan tepat di bawah Bilah Tindakan atas? (Apakah ada cara untuk mengubah gravitasi atau sesuatu dari dialog?) Dan bagaimana melakukannya berdasarkan kode saya ??


Jika Anda menunjukkan tata letak my_dialog xml Anda, kami mungkin dapat membantu Anda membuat perubahan.
Alan Moore


@ Ankit, dapatkah Anda memberikan komentar Anda sebagai jawaban, karena masalah saya terselesaikan setelah memeriksa tautan Anda.
Leem.fin

Jawaban:


235

Saya menggunakan kode ini untuk menampilkan dialog di bagian bawah layar:

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

Kode ini juga mencegah android meredupkan latar belakang dialog, jika Anda membutuhkannya. Anda harus dapat mengubah parameter gravitasi untuk memindahkan dialog


Hai, terima kasih. Saya mengatur gravitasinya ke atas, dialog berjalan di atas layar, tetapi juga menutupi bilah tindakan saya, saya ingin dialog di atas tetapi tepat di bawah bilah tindakan ... bagaimana menyesuaikan ini?
Leem.fin

6
Anda dapat mencoba menggunakan wlp.xdan wlp.ykolom untuk secara eksplisit menyetel lokasi dialog di layar. Saya belum mencobanya sendiri, tetapi mungkin berhasil.
Aleks G

4
Clearing of the dimming tidak berhasil untuk saya (meskipun sisanya bekerja seperti pesona). Saya menemukan solusi untuk peredupan di tempat lain, dalam bentuk: window.clearFlags (WindowManager.LayoutParams.FLAG_DIM_BEHIND);
Rubberduck

@AleksG adakah cara untuk juga mengubah warna latar redup dengan menjaga dailog di tengah? Saya mencoba mengatur windowIsFloating = false ke gaya dailog. Tapi itu menyelaraskan dailog ke atas!
Kshitij

@Kshitij Jika Anda ingin menjaga dialog tetap di tengah, Anda tidak memerlukan kode ini - dialog pusat Android secara default. Sedangkan untuk mengubah warna redup, ini dikontrol oleh temanya. Anda mungkin dapat menimpanya dengan menyertakan tema yang sesuai di aplikasi Anda. Saya tidak pernah mencobanya.
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();
}

Anda dapat menyesuaikan dialog Anda berdasarkan gravitasi dan parameter tata letak mengubah gravitasi dan parameter tata letak berdasarkan kebutuhan Anda


1
Hai, terima kasih. Saya mengatur gravitasinya ke atas, dialog berjalan di atas layar, tetapi juga menutupi bilah tindakan saya, saya ingin dialog di atas tetapi tepat di bawah bilah tindakan ... bagaimana menyesuaikan ini?
Leem.fin

3
Anda dapat mengatur margin atas tata letak
Ramesh Solanki

'FILL_PARENT'sudah ditinggalkan. Saya menggunakan API 21. Sesuai dengan Referensi Pengembang
fWd82

1
@ fWd82 jadi gunakan 'MATCH_PARENT' sebagai gantinya
William

13

Saya menemukan cuplikan kode ini dari kode @gypsicoder di sini

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.


10

Bagi saya, ini berhasil dengan cukup baik di mana saya mencoba memposisikan dialog saya di suatu tempat tepat di bagian bawah tampilan teks tempat dialog itu dipilih.

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

Baru BottomSheetDialog:

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

dialog.show();

5

cukup tambahkan ini ke kode Anda:

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


1

Untuk aktivitas Dialog saya, saya menggunakan yang ini:

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

1

saya menggunakan metode ini

 @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

gunakan bottomSHeet:

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);
    }
}
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.