Я работаю над приложением для Android, где я использую DialogFragment
для отображения диалогового окна, но его ширина очень мала. Как я могу сделать ему эту ширину fill_parent
?
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>
Ответы:
Это решение, которое я придумал для решения этой проблемы:
@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)); } }
Редактировать:
Вы можете использовать приведенный ниже код в
onCrateView
методе Fragment перед возвратом расширенного представления.getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
источник
dialog.getWindow().setBackgroundDrawable(null);
getDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
вставлюonResume()
метод DialogFragment . ПоonCreateView()
методу не вышло. Я немного изменил ответ сdialog
наgetDialog()
.setLayout
вonStart
методе работает отлично. Спасибо.Вы пробовали использовать ответ Элвиса из книги Как заставить диалоговое окно предупреждения заполнять 90% размера экрана ?
Это следующее:
dialog.getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
Обновить:
Вышеупомянутый код должен быть добавлен внутри
onStart()
методаDialogFragment
.источник
WindowManager.LayoutParams.FILL_PARENT
.ViewGroup.LayoutParams
, так что в любом случае он работает отлично.onCreateDialog
Это сработало для меня
Создайте свой собственный стиль:
<style name="DialogStyle" parent="Base.Theme.AppCompat.Dialog"> <item name="android:windowMinWidthMajor">97%</item> <item name="android:windowMinWidthMinor">97%</item> </style>
Вы также можете попробовать использовать правильного родителя для соответствия другим вашим диалогам. например
parent="ThemeOverlay.AppCompat.Dialog"
и так далее.Используйте этот стиль в своем диалоге
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 }
источник
Для меня это сработало, когда я заменил родительский элемент LinearLayout макета, созданного в onCreateView, на RelativeLayout. Никаких других изменений кода не требуется.
источник
<!-- 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" />
в верхней части моего диалогового окна сделали свое дело.
источник
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); } }
и если вы хотите большей гибкости, можете расширить AppCompat_Dialog_Alert и настраиваемые атрибуты
источник
На основе других решений я создал свое.
<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) } }
источник
В моем случае я также использовал следующий подход:
@Override public void onStart() { super.onStart(); getDialog().getWindow().setLayout(LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.dialog_height)); } }
Но на некоторых устройствах Lollipop + (например, Nexus 9) между левым и правым краями диалогового окна и краями экрана все еще оставались небольшие промежутки .
Это было неочевидно, но, наконец, я понял, что для того, чтобы сделать его полной шириной на всех устройствах и платформах, фон окна должен быть указан внутри styles.xml следующим образом:
<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>
И, конечно же, этот стиль необходимо использовать, когда мы создаем диалог, подобный следующему:
public static DialogFragment createNoTitleDlg() { DialogFragment frag = new Some_Dialog_Frag(); frag.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.Dialog_NoTitle); return frag; }
источник
Я хочу прояснить это. Оба пути верны , но с другим DialogFragment .
С помощью
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); } }
С помощью
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); }
источник
Еще одно решение, которое работало для меня без побочных эффектов, было:
В вашем классе, расширяющем DialogFragment:
@Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogStyle); }
В ваших стилях:
<style name="DialogStyle" parent="ThemeOverlay.AppCompat.Dialog.Alert"></style>
источник
setStyle()
У меня это отлично работает.
android:minWidth="300dp"
Таким образом вы можете задать ширину диалоговому окну Fragment.
источник
User AlertDialog.Builder внутри вашего DialogFragment. Добавьте это в
onCreateDialog
метод, подобный этому. ИonCreateView
ничего не делать.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; }
источник
Создайте собственный стиль в файле style.xml. Просто скопируйте и вставьте этот код в свой файл style.xml.
<style name="CustomDialog" parent="@android:style/Theme.Holo.Light" > <item name="android:windowBackground">@null</item> <item name="android:windowIsFloating">true</item> </style>
Затем в методе createDialog вашего DialogFragment создайте объект диалога с помощью кода
dialog = new Dialog(getActivity(), R.style.CustomDialog);
Это работает для меня и надеюсь, что это тоже поможет вам
источник
Вот как я решил, когда столкнулся с этой проблемой. Попробуй это.
в своем DialogFragment onActivityCreated добавьте этот код в соответствии с вашими потребностями ....
@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); }
источник
используйте это в методе onCreateView 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 - высота фрагмента диалога, меняйте ее по своему желанию
источник
в корне вашего макета установите android: minWidth на очень большое значение, например
<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>
источник
Я попробовал несколько ответов, перечисленных выше; они не работали на меня. Это решение моей проблемы:
В
DialogFragment()
, добавить коды ниже: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) } } }
источник
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) } }
источник