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

Leem.fin
sumber
Jika Anda menunjukkan tata letak my_dialog xml Anda, kami mungkin dapat membantu Anda membuat perubahan.
Alan Moore
duplikat? stackoverflow.com/questions/5469005/…
Samir Mangroliya
@ 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

Aleks G
sumber
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

Ramesh Solanki
sumber
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.

Md. Sajedul Karim
sumber
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);
}
Wahib Ul Haq
sumber
10

Baru BottomSheetDialog:

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

dialog.show();
mohamed murashid
sumber
5

cukup tambahkan ini ke kode Anda:

dialog.getWindow().setGravity(Gravity.BOTTOM);
Techashonline
sumber
1
dialog.getWindow().getAttributes().gravity = Gravity.BOTTOM;
Hossein Mansouri
sumber
1

Untuk aktivitas Dialog saya, saya menggunakan yang ini:

WindowManager.LayoutParams lp = this.getWindow().getAttributes();
lp.gravity = Gravity.BOTTOM;
Andris
sumber
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;

}
Mue
sumber
0

gunakan bottomSHeet:

BottomSheetDialog dialog = new BottomSheetDialog(YourActivity.this);
dialog.setContentView(YourView);
dialog.show();
abbasalim
sumber
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);
    }
}
NickUnuchek
sumber