Saya sedang mengerjakan aplikasi android yang saya gunakan DialogFragment
untuk menampilkan dialog tetapi lebarnya sangat kecil. Bagaimana saya bisa membuat lebar ini fill_parent
untuk 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>
Jawaban:
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
onCrateView
metode Fragment sebelum mengembalikan tampilan yang digelembungkan.getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
sumber
dialog.getWindow().setBackgroundDrawable(null);
getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
metode DialogFragmentonResume()
. Itu tidak berhasil padaonCreateView()
metode tersebut. Saya mengubah jawaban sedikit daridialog
menjadigetDialog()
.setLayout
dalamonStart
metode ini bekerja dengan sempurna. Terima kasih.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()
metodeDialogFragment
.sumber
WindowManager.LayoutParams.FILL_PARENT
.ViewGroup.LayoutParams
, jadi ini berfungsi dengan baik.onCreateDialog
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 }
sumber
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.
sumber
<!-- 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.
sumber
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
sumber
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) } }
sumber
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; }
sumber
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); }
sumber
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>
sumber
setStyle()
Ini bekerja untuk saya dengan sempurna.
android:minWidth="300dp"
Melalui ini Anda dapat memberikan lebar pada dialog Fragment.
sumber
User AlertDialog.Builder di dalam DialogFragment Anda. Tambahkan dengan
onCreateDialog
metode seperti ini. DanonCreateView
tidak 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; }
sumber
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
sumber
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); }
sumber
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
sumber
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>
sumber
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) } } }
sumber
getDialog().getWindow() .setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT);
<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>
@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");
<item name="android:windowBackground">@null</item>
class TestDialog : DialogFragment() { override fun onStart() { super.onStart() dialog?.window?.setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT) } }
sumber