Especifico el diseño de mi DialogFragment en un archivo de diseño xml (llamémosle layout_mydialogfragment.xml
), y su layout_width
y layout_height
atributos particular (para ser 100dp
ejemplo de cada LET). Luego inflo este diseño en el onCreateView(...)
método de mi DialogFragment de la siguiente manera:
View view = inflater.inflate(R.layout.layout_mydialogfragment, container, false);
Desafortunadamente, encuentro que cuando aparece mi cuadro de diálogo (DialogFragment), no respeta el layout_width
y layout_height
especificado en su archivo de diseño xml (y mi cuadro de diálogo se reduce o se expande de forma variable según el contenido). ¿Alguien sabe si o cómo puedo hacer que mi diálogo respete layout_width
y layout_height
especifique en su archivo de diseño xml? Por el momento, tengo que especificar el ancho y la altura de mi diálogo nuevamente en el onResume()
método de mi DialogFragment de la siguiente manera ...
getDialog().getWindow().setLayout(width, height);
... Y por lo tanto, indeseablemente, debemos recordar hacer cualquier cambio futuro al ancho y alto del diálogo en dos lugares.
fuente
Respuestas:
Si convierte directamente desde valores de recursos:
Luego especifique match_parent en su diseño para el diálogo:
Solo tiene que preocuparse por un lugar (colóquelo en su
DialogFragment#onResume
). No es perfecto, pero al menos funciona para tener un RelativeLayout como raíz del archivo de diseño de su cuadro de diálogo.fuente
RelativeLayout
y me ayudó. Muchas gracias por la solución, me ahorró mucho tiempo.onResume()
, noonCreateView()
. (Mi diseño raíz es RelativeLayout envuelto en un ScrollView).int width = getResources().getDisplayMetrics().widthPixels
onCreateDialog()
. Necesita estar adentroonResume()
.Terminé anulando
Fragment.onResume()
y tomando los atributos del diálogo subyacente, luego establecí parámetros de ancho / alto allí. Configuré la altura / anchura del diseño más externo enmatch_parent
. Tenga en cuenta que este código también parece respetar los márgenes que definí en el diseño xml.fuente
(android.view.WindowManager.LayoutParams)
, ¿de qué lo estás lanzando? Me sorprendió elegir la importación correcta paraLayoutParams
aparecer en las primeras 3 líneas de la función. Terminé eligiendo(android.view.WindowManager.LayoutParams)
. ¿Se supone que esto es correcto?android.view.WindowManager.LayoutParams
, es inútil usarViewGroup.LayoutParams
tres líneas arriba ... No gana ninguna flexibilidad aquí. Lo que sea, gracias por esta buena respuesta!Obtuve un DialogFragment de tamaño fijo que define lo siguiente en el diseño principal XML (LinearLayout en mi caso):
fuente
Lo único que funcionó en mi caso fue la solución apuntada aquí: http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html
Fragmento de la publicación del blog de Adil:
fuente
getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
funciona perfectamente para un DialogFragment. Pero no entiendo el control de seguridad. ¿Por qué tenemos que verificarnull
?Dialog
(un hijo delDialogFragment
) estará disponible en el momento en que se solicite. Es posible que Android regrese nulo cuando llamemosgetDialog()
.Una forma de controlar el
DialogFragment
ancho y el alto de su es asegurarse de que su diálogo respete el ancho y alto de su vista si su valor esWRAP_CONTENT
.Utilizando
ThemeOverlay.AppCompat.Dialog
Una forma sencilla de lograr esto es hacer uso del
ThemeOverlay.AppCompat.Dialog
estilo que se incluye en la Biblioteca de soporte de Android.DialogFragment
conDialog
:DialogFragment
conAlertDialog
(advertencia:)minHeight="48dp"
:También puede establecer
ThemeOverlay.AppCompat.Dialog
como tema predeterminado al crear sus cuadros de diálogo, agregándolo al tema xml de su aplicación.Tenga cuidado, ya que muchos cuadros de diálogo necesitan el ancho mínimo predeterminado para verse bien.
DialogFragment
conDialog
, haciendo uso deandroid:dialogTheme
:DialogFragment
conAlertDialog
, haciendo uso deandroid:alertDialogTheme
oalertDialogTheme
(advertencia:)minHeight="48dp"
:Prima
En las API de Android anteriores, los
Dialog
s parecen tener algunos problemas de ancho debido a su título (incluso si no configura uno).Si no desea utilizar el
ThemeOverlay.AppCompat.Dialog
estilo yDialog
no necesita un título (o tiene uno personalizado), puede deshabilitarlo:Respuesta desactualizada, no funcionará en la mayoría de los casos
Estaba tratando de hacer que el diálogo respetara el ancho y la altura de mi diseño, sin especificar un tamaño fijo programáticamente.
Me di cuenta de eso
android:windowMinWidthMinor
yandroid:windowMinWidthMajor
estaba causando el problema. Aunque no se incluyeron en el tema de miActivity
oDialog
, todavía se aplicaban alActivity
tema, de alguna manera.Se me ocurrieron tres posibles soluciones.
Solución 1: cree un tema de diálogo personalizado y úselo cuando cree el diálogo en
DialogFragment
.Solución 2: cree un tema personalizado para utilizarlo en uno
ContextThemeWrapper
que sirva comoContext
diálogo. Use esto si no desea crear un tema de diálogo personalizado (por ejemplo, cuando desea usar el tema especificado porandroid:dialogTheme
).Solución 3 (con un
AlertDialog
): hacer cumplirandroid:windowMinWidthMinor
yandroid:windowMinWidthMajor
en loContextThemeWrapper
creado por elAlertDialog$Builder
.fuente
Theme.MaterialComponents.Light.Dialog
como padre y usé este estilo en el constructor deMaterialAlertDialogBuilder
. Tropecé con su respuesta después de una investigación de 1 hora. Gracias y aprobado.Gotcha # 13:
DialogFragment
DiseñosEs una especie de mente adormecedora realmente.
Al crear un
DialogFragment
, puede optar por anularonCreateView
(que pasa unViewGroup
para adjuntar su diseño .xml) oonCreateDialog
, que no lo hace.La elección de anular
OnCreateDialog
oOnCreateView
depender de cómo piensa utilizar el diálogo.OnCreateDialog
.OnCreateView
.Esto es posiblemente lo peor del mundo.
onCreateDialog
LocuraPor lo tanto, está anulando
onCreateDialog
en suDialogFragment
para crear una instancia personalizadaAlertDialog
para mostrar en una ventana. Frio. Pero recuerde,onCreateDialog
no recibeViewGroup
a adjuntar su .xml personalizado diseño a . No hay problema, simplemente pasanull
alinflate
método.Que comience la locura.
Cuando anula
onCreateDialog
, Android COMPLETAMENTE IGNORA varios atributos del nodo raíz del diseño .xml que infla. Esto incluye, pero probablemente no se limita a:background_color
layout_gravity
layout_width
layout_height
Solo la palabra
DialogFragment
me da ganas de vomitar. Podría escribir una novela llena de trucos y problemas de Android, pero esta es una de las más insidiosas.Para volver a la cordura, primero, declaramos un estilo para restaurar SOLO el
background_color
ylayout_gravity
esperamos:El estilo anterior hereda del tema base para Diálogos (en el
AppCompat
tema en este ejemplo).A continuación, aplicamos el estilo mediante programación para recuperar los valores que Android acaba de descartar y restaurar el
AlertDialog
aspecto estándar :El código anterior hará que
AlertDialog
parezca unaAlertDialog
vez más. Quizás esto sea lo suficientemente bueno.¡Pero espera hay mas!
Si está buscando establecer un ESPECÍFICO
layout_width
olayout_height
para suAlertDialog
cuando se muestra (muy probablemente), adivine qué, ¡todavía no ha terminado!La hilaridad continúa cuando te das cuenta de que si intentas establecer un estilo específico
layout_width
olayout_height
en tu nuevo estilo elegante, ¡Android también lo ignorará por completo !:Para establecer un ancho o alto de ventana ESPECÍFICO, puedes pasar a un método completo y tratar con
LayoutParams
:En resumen
Para
DialogFragment
s que anulanonCreateDialog
:AlertDialog
aspecto estándar , cree un estilo que establezcabackground_color
=transparent
ylayout_gravity
=center
y aplique ese estiloonCreateDialog
.layout_width
y / olayout_height
hacerlo programáticamenteonResume
conLayoutParams
fuente
Cuando necesito hacer que DialogFragment sea un poco más ancho, configuro minWidth:
fuente
No veo una razón de peso para anular
onResume
oonStart
para ajustar la anchura y la altura delWindow
plazo deDialogFragment
'sDialog
- estos métodos de ciclo de vida en particular puede ser llamado en repetidas ocasiones e innecesariamente ejecutar ese cambio de tamaño de código más de una vez debido a cosas como la conmutación de múltiples ventana, backgrounding luego poner en primer plano la aplicación, y así sucesivamente. Las consecuencias de esa repetición son bastante triviales, pero ¿por qué conformarse con eso?Establecer el ancho / alto en su lugar dentro de un
onActivityCreated()
método anulado será una mejora porque este método solo se llama una vez por instancia de suDialogFragment
. Por ejemplo:Arriba, acabo de configurar el ancho para que sea
match_parent
independiente de la orientación del dispositivo. Si desea que su cuadro de diálogo horizontal no sea tan amplio, puede verificar si estágetResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
previamente.fuente
La dimensión en el diseño más externo no funciona en el diálogo. Puede agregar un diseño donde establecer la dimensión debajo de la más externa.
fuente
Lo arreglé configurando los parámetros de diseño del elemento raíz.
fuente
Aquí hay una manera de establecer el ancho / alto de DialogFragment en xml. Simplemente ajuste su viewHierarchy en Framelayout (cualquier diseño funcionará) con un fondo transparente.
Un fondo transparente parece ser una bandera especial, porque automáticamente centra el elemento secundario de frameLayout en la ventana cuando haces eso. Aún obtendrá el oscurecimiento de la pantalla completa detrás de su fragmento, lo que indica que su fragmento es el elemento activo.
fuente
Aquí está la versión de Kotlin
fuente
Puede usar el porcentaje para el ancho.
Usé Holo Theme para este ejemplo.
fuente
Puede debajo del código para establecer el ancho y la altura del diseño desde Java.
fuente
Creo el diálogo usando AlertDialog.Builder, así que usé la respuesta de Rodrigo dentro de un OnShowListener.
fuente
Snicolas
en la discusión de "DialogFragment
vsAlertDialog
" en stackoverflow.com/a/7979823/3372061 .Trabajando en Android 6.0, se encontró con el mismo problema.
AlertDialog
pasaría de forma predeterminada alwidth
conjunto predefinido en el tema, independientemente delwidth
conjunto real en la raíz de la vista personalizadaLayout
. Pude conseguir que se ajustara correctamente ajustandowidth
elloading_message
TextView
. Sin investigar más, parece que dimensionar los elementos reales y tener laLayout
envoltura raíz a su alrededor hace que funcione como se esperaba. A continuación se muestra un diseño XML de un cuadro de diálogo de carga que establecewidth
correctamente el cuadro de diálogo. Usando esta biblioteca para la animación.fuente
Fácil y solido:
fuente
En mi caso
DialogFragment
ocupaba el tamaño completo de la actividad como aFragment
. ElDialogFragment
se basó en el diseño XML, noAlertDialog
. Mi error fue agregar el fragmento de diálogoFragmentManager
como un fragmento habitual:En cambio, necesito
show
el fragmento de diálogo:Después de algunas modificaciones (que tengo
ViewPager2
en el diseño), el fragmento de diálogo se volvió demasiado estrecho:Usé la solución de N1hk :
Ahora ha definido el ancho y la altura, no el tamaño completo de la actividad.
Quiero decir sobre
onCreateView
yonCreateDialog
. Si tiene un fragmento de diálogo basado en el diseño, puede usar cualquiera de estos 2 métodos.1) Si usa
onCreateView
, entonces debe usaronActivityCreated
para establecer el ancho.2) Si usa en
onCreateDialog
lugar deonCreateView
, puede establecer parámetros allí.onActivityCreated
No será necesario.fuente
En mi caso fue causado por
align_parentBottom="true"
una vista dentro de aRelativeLayout
. Se eliminaron todos los alignParentBottom's y se cambiaron todos los diseños a LinearLayouts verticales y el problema desapareció.fuente
Establezca el diseño principal del diseño de diálogo personalizado en RelativeLayout , obtenga el ancho y la altura comunes automáticamente.
fuente
Una de las soluciones anteriores casi funcionó. Intenté algo un poco diferente y terminó funcionando para mí.
(Asegúrese de mirar su solución) Esta fue su solución. Haga clic aquí Funcionó a excepción de: builder.getContext (). GetTheme (). ApplyStyle (R.style.Theme_Window_NoMinWidth, true);
Lo cambié a
La última línea es realmente diferente.
fuente
fuente
Esta es la solución más simple.
La mejor solución que he encontrado es anular en
onCreateDialog()
lugar deonCreateView()
. setContentView () establecerá las dimensiones correctas de la ventana antes de inflar. Elimina la necesidad de almacenar / establecer una dimensión, color de fondo, estilo, etc. en archivos de recursos y configurarlos manualmente.fuente
Añadir a su
FragmentDialog
:fuente
Esto funcionará perfectamente.
fuente
Para obtener un diálogo que cubra casi toda la pantalla: Primero defina una clase ScreenParameter
Luego debe llamar al ScreenParamater antes de su método getDialog.getWindow (). SetLayout ()
fuente