Especifico el diseño de mi DialogFragment en un archivo de diseño xml (llamémosle layout_mydialogfragment.xml), y su layout_widthy layout_heightatributos particular (para ser 100dpejemplo 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_widthy layout_heightespecificado 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_widthy layout_heightespecifique 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
RelativeLayouty 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().widthPixelsonCreateDialog(). 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 paraLayoutParamsaparecer 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.LayoutParamstres 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
DialogFragmentancho 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.DialogUna forma sencilla de lograr esto es hacer uso del
ThemeOverlay.AppCompat.Dialogestilo que se incluye en la Biblioteca de soporte de Android.DialogFragmentconDialog:DialogFragmentconAlertDialog(advertencia:)minHeight="48dp":También puede establecer
ThemeOverlay.AppCompat.Dialogcomo 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.
DialogFragmentconDialog, haciendo uso deandroid:dialogTheme:DialogFragmentconAlertDialog, haciendo uso deandroid:alertDialogThemeoalertDialogTheme(advertencia:)minHeight="48dp":Prima
En las API de Android anteriores, los
Dialogs parecen tener algunos problemas de ancho debido a su título (incluso si no configura uno).Si no desea utilizar el
ThemeOverlay.AppCompat.Dialogestilo yDialogno 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:windowMinWidthMinoryandroid:windowMinWidthMajorestaba causando el problema. Aunque no se incluyeron en el tema de miActivityoDialog, todavía se aplicaban alActivitytema, 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
ContextThemeWrapperque sirva comoContextdiá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:windowMinWidthMinoryandroid:windowMinWidthMajoren loContextThemeWrappercreado por elAlertDialog$Builder.fuente
Theme.MaterialComponents.Light.Dialogcomo 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:
DialogFragmentDiseñosEs una especie de mente adormecedora realmente.
Al crear un
DialogFragment, puede optar por anularonCreateView(que pasa unViewGrouppara adjuntar su diseño .xml) oonCreateDialog, que no lo hace.La elección de anular
OnCreateDialogoOnCreateViewdepender de cómo piensa utilizar el diálogo.OnCreateDialog.OnCreateView.Esto es posiblemente lo peor del mundo.
onCreateDialogLocuraPor lo tanto, está anulando
onCreateDialogen suDialogFragmentpara crear una instancia personalizadaAlertDialogpara mostrar en una ventana. Frio. Pero recuerde,onCreateDialogno recibeViewGroupa adjuntar su .xml personalizado diseño a . No hay problema, simplemente pasanullalinflatemé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_colorlayout_gravitylayout_widthlayout_heightSolo la palabra
DialogFragmentme 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_colorylayout_gravityesperamos:El estilo anterior hereda del tema base para Diálogos (en el
AppCompattema en este ejemplo).A continuación, aplicamos el estilo mediante programación para recuperar los valores que Android acaba de descartar y restaurar el
AlertDialogaspecto estándar :El código anterior hará que
AlertDialogparezca unaAlertDialogvez más. Quizás esto sea lo suficientemente bueno.¡Pero espera hay mas!
Si está buscando establecer un ESPECÍFICO
layout_widtholayout_heightpara suAlertDialogcuando 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_widtholayout_heighten 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
DialogFragments que anulanonCreateDialog:AlertDialogaspecto estándar , cree un estilo que establezcabackground_color=transparentylayout_gravity=centery aplique ese estiloonCreateDialog.layout_widthy / olayout_heighthacerlo programáticamenteonResumeconLayoutParamsfuente
Cuando necesito hacer que DialogFragment sea un poco más ancho, configuro minWidth:
fuente
No veo una razón de peso para anular
onResumeoonStartpara ajustar la anchura y la altura delWindowplazo 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_parentindependiente 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_PORTRAITpreviamente.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
Snicolasen la discusión de "DialogFragmentvsAlertDialog" en stackoverflow.com/a/7979823/3372061 .Trabajando en Android 6.0, se encontró con el mismo problema.
AlertDialogpasaría de forma predeterminada alwidthconjunto predefinido en el tema, independientemente delwidthconjunto real en la raíz de la vista personalizadaLayout. Pude conseguir que se ajustara correctamente ajustandowidthelloading_messageTextView. Sin investigar más, parece que dimensionar los elementos reales y tener laLayoutenvoltura 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 establecewidthcorrectamente el cuadro de diálogo. Usando esta biblioteca para la animación.fuente
Fácil y solido:
fuente
En mi caso
DialogFragmentocupaba el tamaño completo de la actividad como aFragment. ElDialogFragmentse basó en el diseño XML, noAlertDialog. Mi error fue agregar el fragmento de diálogoFragmentManagercomo un fragmento habitual:En cambio, necesito
showel fragmento de diálogo:Después de algunas modificaciones (que tengo
ViewPager2en 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
onCreateViewyonCreateDialog. 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 usaronActivityCreatedpara establecer el ancho.2) Si usa en
onCreateDialoglugar deonCreateView, puede establecer parámetros allí.onActivityCreatedNo 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