Cara membuat lebar DialogFragment menjadi Fill_Parent


100

Saya sedang mengerjakan aplikasi android yang saya gunakan DialogFragmentuntuk menampilkan dialog tetapi lebarnya sangat kecil. Bagaimana saya bisa membuat lebar ini fill_parentuntuk itu?

public class AddNoteDialogFragment extends DialogFragment {

    public AddNoteDialogFragment() {
        // Empty constructor required for DialogFragment
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        getDialog().setTitle(getString(R.string.app_name));
        View view = inflater.inflate(R.layout.fragment_add_note_dialog,
                container);

        return view;
    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        Dialog dialog = super.onCreateDialog(savedInstanceState);

        // request a window without the title
        dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

        return dialog;
    }
}

fragment_add_note_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin" >

    <EditText
        android:id="@+id/addNoteEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:hint="@string/clock_enter_add_note"
        android:imeOptions="actionDone"
        android:inputType="textCapSentences|textMultiLine"
        android:lines="5" />

    <Button
        android:id="@+id/submit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@drawable/login_button"
        android:text="@string/submit_button"
        android:textColor="@android:color/white" />

</LinearLayout>


3
Sebenarnya, tata letak yang sama persis menggunakan RelativeLayout ditampilkan dengan sangat baik. Saya tidak menjelaskan itu ...
Dan Chaltiel

Jawaban:


157

Ini adalah solusi yang saya temukan untuk menangani masalah ini:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);    
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);

    return dialog;
}

@Override
public void onStart() {
    super.onStart();

    Dialog dialog = getDialog();
    if (dialog != null) {
       dialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
       dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
    }
}

Edit:

Anda dapat menggunakan kode di bawah ini dalam onCrateViewmetode Fragment sebelum mengembalikan tampilan yang digelembungkan.

getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));

3
Anda bisa menelepondialog.getWindow().setBackgroundDrawable(null);
edwardaa

jika disetel ke nol, itu tidak transparan ... hanya hitam, pada 4.0.4
Joao Polo

17
Bagi saya, ini berfungsi jika saya memasukkan getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);metode DialogFragment onResume(). Itu tidak berhasil pada onCreateView()metode tersebut. Saya mengubah jawaban sedikit dari dialogmenjadi getDialog().
Rock Lee

2
setLayoutdalam onStartmetode ini bekerja dengan sempurna. Terima kasih.
wonsuc

82

Sudahkah Anda mencoba menggunakan jawaban Elvis dari Bagaimana membuat dialog peringatan mengisi 90% ukuran layar ?

Ini adalah sebagai berikut:

dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

Memperbarui:

Kode di atas harus ditambahkan di dalam onStart()metode DialogFragment.


4
LayoutParams mana yang Anda impor?
ymerdrengene

1
@ymerdrengene Pertanyaan yang sangat bagus sebenarnya. Coba WindowManager.LayoutParams.FILL_PARENT.
EpicPandaForce

2
@ymerdrengene meskipun secara teknis, mereka semua hanya mewarisi nilai ini dari ViewGroup.LayoutParams, jadi ini berfungsi dengan baik.
EpicPandaForce

1
Seperti yang disebutkan di sini stackoverflow.com/a/15279400/1641882 Saya akan menyarankan untuk memindahkan kode ini keonCreateDialog
Ishan

1
impor android.view.WindowManager;
kirti

53

Ini berhasil untuk saya

Buat gaya kustom Anda:

   <style name="DialogStyle" parent="Base.Theme.AppCompat.Dialog">
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
   </style>

Anda juga dapat mencoba menggunakan orang tua yang tepat untuk mencocokkan dialog Anda yang lain. misalnya parent="ThemeOverlay.AppCompat.Dialog"dan sebagainya.

Gunakan gaya ini dalam dialog Anda

public class MessageDialog extends DialogFragment {

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

// your code 
}

3
solusi cantik dengan <item name = "android: windowBackground"> ​​@ null </item>.
Evgeny Sinitsky

1
berhati-hatilah untuk menggunakan orang tua yang tepat agar sesuai dengan dialog Anda yang lain. dalam kasus saya itu adalah ThemeOverlay.AppCompat.Dialog
quealegriamasalegre

31

Bagi saya, ini berhasil ketika saya mengganti induk LinearLayout dari tata letak yang digelembungkan di onCreateView oleh RelativeLayout. Tidak ada perubahan kode lain yang diperlukan.


6
Biasanya, jawaban paling tidak populer di stack overflow memecahkan masalah saya. Terima kasih
busuu

1
Saya sangat menyukai jawaban ini tetapi bukankah alasan mengapa ini berfungsi hanya untuk tata letak relatif?
Prateek Gupta

19
    <!-- A blank view to force the layout to be full-width -->
    <View
        android:layout_width="wrap_content"
        android:layout_height="1dp"
        android:layout_gravity="fill_horizontal" />

di bagian atas tata letak dialog saya melakukan triknya.


3
Ini bekerja untuk saya, dan saya suka bahwa tidak mengharuskan kita untuk menambahkan sesuatu yang ekstra dalam kode, tapi saya bertanya-tanya mengapa ini berhasil ...
shela

Hebatnya, ini adalah satu-satunya hal yang berhasil untuk saya. Gaya khusus tidak.
Magnus W

19
public class FullWidthDialogFragment extends AppCompatDialogFragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, R.style.Theme_AppCompat_Light_Dialog_Alert);
    }
}

dan jika Anda ingin lebih banyak fleksibilitas dapat memperluas AppCompat_Dialog_Alert dan atribut khusus


12

Berdasarkan solusi lain, saya telah membuatnya sendiri.

<style name="AppTheme.Dialog.Custom" parent="Theme.AppCompat.Light.Dialog.Alert">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowMinWidthMajor">100%</item>
    <item name="android:windowMinWidthMinor">100%</item>
</style>
abstract class BaseDialogFragment : DialogFragment() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setStyle(DialogFragment.STYLE_NO_TITLE, R.style.AppTheme_Dialog_Custom)
    }
}

11

Dalam kasus saya, saya juga menggunakan pendekatan berikut:

    @Override
    public void onStart() {
        super.onStart();
        getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.dialog_height));
    }
}

Tapi masih ada celah kecil antara tepi kiri dan kanan dialog dan tepi layar pada beberapa perangkat Lollipop + (misalnya Nexus 9).

Itu tidak jelas tetapi akhirnya saya menemukan bahwa untuk membuatnya lebar penuh di semua perangkat dan latar belakang jendela platform harus ditentukan di dalam styles.xml seperti berikut:

<style name="Dialog.NoTitle" parent="Theme.AppCompat.Dialog">
    <item name="android:windowNoTitle">true</item>
    <item name="android:padding">0dp</item>
    <item name="android:windowBackground">@color/window_bg</item>
</style>

Dan tentunya style ini perlu digunakan saat kita membuat dialog seperti berikut:

    public static DialogFragment createNoTitleDlg() {
        DialogFragment frag = new Some_Dialog_Frag();
        frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle);
        return frag;
}

2
Ini harus menjadi jawaban yang diterima! Menyelamatkan saya begitu banyak waktu! Latar belakang jendela berhasil.
Karan

11

Saya ingin menjelaskan ini. Kedua cara tersebut benar, tetapi dengan DialogFragment yang berbeda .

Menggunakan android.app.DialogFragment

@Override
public void onStart()
{
    super.onStart();
    Dialog dialog = getDialog();
    if (dialog != null)
    {
        int width = ViewGroup.LayoutParams.MATCH_PARENT;
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        dialog.getWindow().setLayout(width, height);
    }
}

Menggunakan android.support.v4.app.DialogFragment

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
}

Pada dasarnya saya membutuhkan lebar penuh dan ini berhasil. Terima kasih!
sud007

4

Solusi lain yang berhasil untuk saya tanpa efek samping adalah:

Di kelas Anda yang memperluas DialogFragment:

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle);
}

Dalam gaya Anda:

<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>

Anda dapat langsung menggunakan tema peringatan disetStyle()
Sony

4

Ini bekerja untuk saya dengan sempurna.

android:minWidth="300dp"

Melalui ini Anda dapat memberikan lebar pada dialog Fragment.


2

User AlertDialog.Builder di dalam DialogFragment Anda. Tambahkan dengan onCreateDialogmetode seperti ini. Dan onCreateViewtidak melakukan apa-apa.

public Dialog onCreateDialog(Bundle savedInstanceState)
{

    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
    View view = LayoutInflater.from(getContext()).inflate(R.layout.gf_confirm_order_timeout_dialog, null);
    final Bundle args = getArguments();
    String message = args.getString(GfConstant.EXTRA_DATA);
    TextView txtMessage = (TextView) view.findViewById(R.id.txt_message);
    txtMessage.setText(message);

    view.findViewById(R.id.btn_confirm).setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if (mListener != null)
            {
                mListener.onDialogConfirmOK();
            }
        }
    });
    builder.setView(view);
    Dialog dialog = builder.create();
    dialog.setCanceledOnTouchOutside(false);
    dialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    return dialog;
}

2

Buat gaya kustom di file style.xml Anda. Cukup salin dan tempel kode ini ke file style.xml Anda

<style name="CustomDialog" parent="@android:style/Theme.Holo.Light" >
    <item name="android:windowBackground">@null</item>
    <item name="android:windowIsFloating">true</item>
</style>

Kemudian dalam metode createDialog dari DialogFragment Anda, buat objek dialog dengan kode

 dialog = new Dialog(getActivity(), R.style.CustomDialog);

Ini berhasil untuk saya dan berharap ini akan membantu Anda juga


Saya harus menambahkan yang berikut ini ke gaya untuk membuatnya bekerja untuk saya: <item name = "android: windowMinWidthMajor"> 100% </item> <item name = "android: windowMinWidthMinor"> 100% </item>
Arnout

2

Inilah cara saya menyelesaikannya ketika saya menghadapi masalah ini. Coba ini.

di onActivityCreated DialogFragment Anda, Tambahkan kode ini sesuai kebutuhan Anda ....

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        myview=inflater.inflate(R.layout.fragment_insurance_detail, container, false);
        intitviews();
        return myview;
    }
    @Override
    public void onActivityCreated(Bundle arg0) {
        super.onActivityCreated(arg0);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimation;
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        getDialog().getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        getDialog().getWindow().setGravity(Gravity.CENTER);
    }

1

gunakan ini dalam metode onCreateView dari DialogFragment

    Display display = getActivity().getWindowManager().getDefaultDisplay();
    int width = display.getWidth();
    int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, **220**, getResources().getDisplayMetrics());
    getDialog().getWindow().setLayout(width,px);

220 adalah tinggi fragmen dialog, ubah sesuai keinginan


1

di root layout Anda, setel android: minWidth ke nilai yang sangat besar, mis

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:minWidth="9999999dp">

   ...

</LinearLayout>

0

Saya mencoba beberapa jawaban yang tercantum di atas; mereka tidak bekerja untuk saya. Ini adalah solusi untuk masalah saya:

Di DialogFragment(), tambahkan kode di bawah ini:

override fun onResume() {
    super.onResume()
    if (showsDialog) {
        val width = ViewGroup.LayoutParams.MATCH_PARENT
        val height = ViewGroup.LayoutParams.WRAP_CONTENT
        dialog?.window?.apply {
            setBackgroundDrawable(ColorDrawable(Color.WHITE))
            attributes.gravity = Gravity.BOTTOM
            setLayout(width, height)
        }
    }
}

0

opsi 1. tambahkan kode berikut di oncreate in activity

 getDialog().getWindow()
         .setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);

atau Anda dapat membuat gaya kustom untuk Dialog

<style name="CustomDialog" parent="AppTheme" >
  <item name="android:windowNoTitle">true</item>
  <item name="android:windowFullscreen">true</item>
  <item name="android:windowIsFloating">true</item>
  <item name="android:windowCloseOnTouchOutside">true</item>
</style>
then use that style in dialog fragment
@Override public void onCreate(@Nullable Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setStyle(DialogFragment.STYLE_NORMAL, R.style.CustomDialog);
}

@Override public void onStart() {
  super.onStart();
  getDialog().getWindow()
    .setLayout(WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.MATCH_PARENT);
}

SampleDialogFragment sampleDialogFragment = new SampleDialogFragment();
SampleDialogFragment.show(getActivity().getSupportFragmentManager(), "sometag");

ATAU Anda mencoba kode berikut dengan gaya akan membantu Anda

<item name="android:windowBackground">@null</item>

Solusi 2: dialog.window.setLayout

class TestDialog : DialogFragment() {

    override fun onStart() {
        super.onStart()

        dialog?.window?.setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT)
    }

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