Я указываю макет моего DialogFragment в файле макета xml (давайте назовем его layout_mydialogfragment.xml
), а также его атрибуты layout_width
и layout_height
атрибуты ( 100dp
скажем, каждый). Затем я раздуваю этот макет в методе DialogFragment onCreateView(...)
следующим образом:
View view = inflater.inflate(R.layout.layout_mydialogfragment, container, false);
К сожалению, я обнаружил, что когда появляется мое диалоговое окно (DialogFragment), оно не учитывает layout_width
и не layout_height
указано в его файле макета xml (и мое диалоговое окно сжимается или расширяется в зависимости от содержимого). Кто-нибудь знает, можно ли или как заставить мой диалог уважать layout_width
и layout_height
указанный в его XML-файле макета? В данный момент мне нужно снова указать ширину и высоту моего диалога в методе DialogFragment onResume()
следующим образом ...
getDialog().getWindow().setLayout(width, height);
... И поэтому, нежелательно, нужно помнить, чтобы в будущем вносить изменения в ширину и высоту диалога в двух местах.
источник
Ответы:
Если вы конвертируете напрямую из значений ресурсов:
Затем укажите match_parent в вашем макете для диалога:
Вам нужно беспокоиться только об одном месте (поместите его в свой
DialogFragment#onResume
). Он не идеален, но, по крайней мере, работает с RelativeLayout в качестве корня файла макета вашего диалога.источник
RelativeLayout
и это помогло мне. Большое спасибо за решение - оно сэкономило мне много времени.onResume()
, а неonCreateView()
. (Мой корневой макет - RelativeLayout, обернутый в ScrollView.)int width = getResources().getDisplayMetrics().widthPixels
onCreateDialog()
. Должен быть вonResume()
.В итоге я переопределил
Fragment.onResume()
и взял атрибуты из основного диалога, а затем установил параметры ширины / высоты. Я установил максимальную высоту макета / ширинуmatch_parent
. Обратите внимание, что этот код, похоже, учитывает поля, которые я определил и в макете xml.источник
(android.view.WindowManager.LayoutParams)
это делаете? Я был озадачен, выбирая правильный импорт дляLayoutParams
появления в первых 3 строках функции. Закончился выбор(android.view.WindowManager.LayoutParams)
. Это должно быть правильно?android.view.WindowManager.LayoutParams
, бесполезно использоватьViewGroup.LayoutParams
три строки выше ... Вы здесь не получаете никакой гибкости. Как бы то ни было, спасибо за хороший ответ!Я получил фиксированный размер DialogFragment, определяющий следующее в основном макете XML (LinearLayout в моем случае):
источник
Единственное, что сработало в моем случае, было решение, указанное здесь: http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html
Фрагмент из поста Adil:
источник
getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
отлично работает для DialogFragment. Но я не понимаю проверки безопасности. почему мы должны проверитьnull
?Dialog
(ребенокDialogFragment
) будет доступен в момент запроса. Вполне возможно, что Android вернет ноль, когда мы позвонимgetDialog()
.Один из способов контролировать
DialogFragment
ширину и высоту вашего экрана - убедиться, что его диалог учитывает ширину и высоту вашего представления, если их значение равноWRAP_CONTENT
.С помощью
ThemeOverlay.AppCompat.Dialog
Один из простых способов добиться этого - использовать
ThemeOverlay.AppCompat.Dialog
стиль, включенный в библиотеку поддержки Android.DialogFragment
сDialog
:DialogFragment
сAlertDialog
(предостережение:)minHeight="48dp"
:Вы также можете установить
ThemeOverlay.AppCompat.Dialog
в качестве темы по умолчанию при создании ваших диалогов, добавив ее в тему XML вашего приложения.Будьте осторожны, так как многие диалоги нуждаются в минимальной ширине по умолчанию, чтобы хорошо выглядеть.
DialogFragment
сDialog
использованиемandroid:dialogTheme
:DialogFragment
сAlertDialog
, используяandroid:alertDialogTheme
илиalertDialogTheme
(предостережение:)minHeight="48dp"
:бонус
В более старых Android API,
Dialog
кажется, есть некоторые проблемы с шириной из-за их названия (даже если вы не установили один).Если вы не хотите использовать
ThemeOverlay.AppCompat.Dialog
стиль и вамDialog
не нужен заголовок (или у вас есть собственный), вы можете отключить его:Устаревший ответ, в большинстве случаев работать не будет
Я пытался заставить диалог учитывать ширину и высоту моего макета, без указания фиксированного размера программно.
Я понял это
android:windowMinWidthMinor
иandroid:windowMinWidthMajor
был причиной проблемы. Несмотря на то, что они не были включены в тему моегоActivity
илиDialog
, они по - прежнему применяются кActivity
теме, так или иначе.Я придумал три возможных решения.
Решение 1. Создайте пользовательскую тему диалога и используйте ее при создании диалога в
DialogFragment
.Решение 2: создать собственную тему , которая будет использоваться в
ContextThemeWrapper
который будет служитьContext
для диалога. Используйте это, если вы не хотите создавать собственную тему диалога (например, когда вы хотите использовать тему, указанную вandroid:dialogTheme
).Решение 3 (с
AlertDialog
): исполнениеandroid:windowMinWidthMinor
иandroid:windowMinWidthMajor
вContextThemeWrapper
созданном с помощьюAlertDialog$Builder
.источник
Theme.MaterialComponents.Light.Dialog
качестве родителя и использовал этот стиль в конструктореMaterialAlertDialogBuilder
. Наткнулся на ваш ответ после исследования 1 часа. Спасибо и палец вверх.Получил # 13:
DialogFragment
макетыЭто своего рода оцепенение на самом деле.
При создании
DialogFragment
, вы можете выбрать переопределитьonCreateView
(который передает,ViewGroup
чтобы присоединить ваш XML-макет) илиonCreateDialog
, что нет.Выбор того, следует ли переопределить
OnCreateDialog
илиOnCreateView
зависит от того, как вы собираетесь использовать диалоговое окно.OnCreateDialog
.OnCreateView
.Это, возможно, худшая вещь в мире.
onCreateDialog
невменяемостьТаким образом, вы переопределяете
onCreateDialog
свой собственный,DialogFragment
чтобы создать настроенный экземплярAlertDialog
для отображения в окне. Прохладно. Но помните,onCreateDialog
получает нет,ViewGroup
чтобы прикрепить ваш пользовательский .xml макет к . Нет проблем, вы просто переходитеnull
кinflate
методу.Пусть начнется безумие.
При переопределении
onCreateDialog
Android полностью игнорирует несколько атрибутов корневого узла разметки .xml, которую вы раздувает. Это включает, но, вероятно, не ограничивается:background_color
layout_gravity
layout_width
layout_height
Просто слово
DialogFragment
заставляет меня хотеть рвать. Я мог бы написать роман, наполненный Android getchas и snafus, но этот - один из самых внутренних.Чтобы вернуться к здравомыслию, сначала мы объявляем стиль для восстановления ПРОСТО
background_color
иlayout_gravity
ожидаем:Приведенный выше стиль наследуется от базовой темы для диалогов (в
AppCompat
теме в этом примере).Далее мы применяем стиль программно, чтобы вернуть значения, которые Android просто отбросил, и восстановить стандартный
AlertDialog
внешний вид:Код выше сделает ваш
AlertDialog
видAlertDialog
снова. Может быть, это достаточно хорошо.Но подождите, это еще не все!
Если вы хотите установить SPECIFIC
layout_width
илиlayout_height
для своего,AlertDialog
когда он показан (очень вероятно), то угадайте, что, вы еще не сделали!Веселье продолжается, когда вы понимаете, что, если вы попытаетесь установить определенный
layout_width
илиlayout_height
в своем модном новом стиле, Android тоже полностью проигнорирует это !:Чтобы установить ОСОБЕННУЮ ширину или высоту окна, вы можете перейти к целому методу Нутера и иметь дело с
LayoutParams
:В итоге
Для
DialogFragment
переопределенияonCreateDialog
:AlertDialog
внешний вид, создайте стиль, который устанавливаетbackground_color
=transparent
иlayout_gravity
=,center
и примените этот стиль вonCreateDialog
.layout_width
и / илиlayout_height
, сделать это программноonResume
сLayoutParams
источник
Когда мне нужно сделать DialogFragment немного шире, я устанавливаю minWidth:
источник
Я не вижу оснований , чтобы отменить
onResume
илиonStart
установить ширину и высоту вWindow
пределахDialogFragment
«sDialog
- именно эти методы жизненного цикла могут вызываться неоднократно и без необходимости выполнять , что изменение размера кода более чем один раз из - за таких вещей , как мульти переключения окон, фоновый затем приоритетное приложение и так далее. Последствия этого повторения довольно тривиальны, но зачем соглашаться на это?Установка width / height вместо этого внутри переопределенного
onActivityCreated()
метода будет улучшением, потому что этот метод реально вызывается только один раз для каждого вашего экземпляраDialogFragment
. Например:Выше я просто установил ширину
match_parent
независимо от ориентации устройства. Если вы хотите, чтобы ваш пейзажный диалог не был таким широким, вы можете проверить егоgetResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
заранее.источник
Измерение во внешнем макете не работает в диалоге. Вы можете добавить макет, где установить размер ниже самого внешнего.
источник
Я исправил это, установив параметры макета корневого элемента.
источник
Вот способ установить ширину / высоту DialogFragment в xml. Просто оберните вашу viewHierarchy в Framelayout (любой макет будет работать) с прозрачным фоном.
Прозрачный фон кажется специальным флагом, потому что при этом он автоматически центрирует дочерний элемент frameLayout в окне. Вы по-прежнему получите полное затемнение экрана за своим фрагментом, указывая, что ваш фрагмент является активным элементом.
источник
Вот котлин версия
источник
Вы можете использовать процент для ширины.
Я использовал Holo Theme для этого примера.
источник
Вы можете ниже кода, чтобы установить ширину макета и высоту из Java.
источник
Я создаю диалог, используя AlertDialog.Builder, поэтому я использовал ответ Родриго внутри OnShowListener.
источник
Snicolas
в обсуждении "DialogFragment
vsAlertDialog
" на stackoverflow.com/a/7979823/3372061 .Работая на Android 6.0, столкнулся с той же проблемой.
AlertDialog
будет по умолчанию предопределеннымwidth
набором в теме независимо от фактическогоwidth
набора в корне пользовательского представленияLayout
. Я был в состоянии получить его , чтобы установить должным образом регулируяwidth
изloading_message
TextView
. Без дальнейших исследований, кажется, что определение размеров реальных элементов иLayout
обворачивание корня вокруг них заставляет его работать как положено. Ниже приведен XML-формат диалогового окна загрузки, которыйwidth
правильно устанавливает диалоговое окно. Использование этой библиотеки для анимации.источник
Легко и солидно:
источник
В моем случае
DialogFragment
занято в полном объеме деятельности, какFragment
. ОнDialogFragment
был основан на XML-макетеAlertDialog
. Моя ошибка заключалась в добавлении фрагмента диалогаFragmentManager
как обычного фрагмента:Вместо этого мне нужен
show
фрагмент диалога:После некоторого редактирования (у меня
ViewPager2
в макете) фрагмент диалога стал слишком узким:Я использовал решение N1hk :
Теперь он определил ширину и высоту, а не полный размер активности.
Я хочу сказать об
onCreateView
иonCreateDialog
. Если у вас есть фрагмент диалога, основанный на макете, вы можете использовать любой из этих двух методов.1) Если вы используете
onCreateView
, то вы должны использовать,onActivityCreated
чтобы установить ширину.2) Если вы используете
onCreateDialog
вместоonCreateView
, вы можете установить параметры там.onActivityCreated
не понадобитсяисточник
В моем случае это было вызвано
align_parentBottom="true"
представлением внутриRelativeLayout
. Удалил все alignParentBottom и изменил все макеты на вертикальные LinearLayouts и проблема исчезла.источник
Установите для родительского макета пользовательского диалогового окна значение RelativeLayout , автоматически получайте общую ширину и высоту.
источник
Одно из ранних решений почти сработало. Я попробовал что-то немного другое, и это сработало для меня.
(Убедитесь, что вы посмотрите на его решение). Это было его решением. Нажмите здесь. Это сработало, за исключением: builder.getContext (). GetTheme (). ApplyStyle (R.style.Theme_Window_NoMinWidth, true);
Я изменил это на
Последняя строка действительно отличается.
источник
источник
Это самое простое решение
Лучшее решение, которое я нашел, это переопределить
onCreateDialog()
вместоonCreateView()
. setContentView () установит правильные размеры окна перед надуванием. Это устраняет необходимость сохранять / устанавливать размер, цвет фона, стиль и т. Д. В файлах ресурсов и устанавливать их вручную.источник
Добавьте к вашему
FragmentDialog
:источник
Это будет работать отлично.
источник
Чтобы получить диалоговое окно, которое охватывает почти весь экран, сначала определите класс ScreenParameter.
Затем вы должны вызвать ScreenParamater перед вашим методом getDialog.getWindow (). SetLayout ()
источник