Je spécifie la mise en page de mon DialogFragment dans un fichier de mise en page xml (appelons-le layout_mydialogfragment.xml
), et ses attributs layout_width
et en layout_height
particulier (pour être 100dp
chacun, disons). Je gonfle ensuite cette mise en page dans la onCreateView(...)
méthode de mon DialogFragment comme suit:
View view = inflater.inflate(R.layout.layout_mydialogfragment, container, false);
Malheureusement, je trouve que lorsque ma boîte de dialogue (DialogFragment) apparaît, elle ne respecte pas le layout_width
et layout_height
spécifié dans son fichier de mise en page xml (et ma boîte de dialogue se rétrécit ou s'agrandit de manière variable en fonction du contenu). Quelqu'un sait si ou comment je peux faire en sorte que ma boîte de dialogue respecte le layout_width
et layout_height
spécifié dans son fichier de mise en page XML? Pour le moment, je dois à nouveau spécifier la largeur et la hauteur de ma boîte de dialogue dans la onResume()
méthode de mon DialogFragment comme suit ...
getDialog().getWindow().setLayout(width, height);
... Et donc, de manière indésirable, ne pas oublier de modifier à l'avenir la largeur et la hauteur du dialogue à deux endroits.
Réponses:
Si vous effectuez une conversion directement à partir des valeurs de ressources:
Spécifiez ensuite match_parent dans votre mise en page pour la boîte de dialogue:
Vous n'avez qu'à vous soucier d'un seul endroit (placez-le dans votre
DialogFragment#onResume
). Ce n'est pas parfait, mais au moins cela fonctionne pour avoir un RelativeLayout comme racine du fichier de mise en page de votre boîte de dialogue.la source
RelativeLayout
et cela m'a aidé. Merci beaucoup pour la solution - cela m'a fait gagner beaucoup de temps.onResume()
, nononCreateView()
. (Ma disposition racine est RelativeLayout enveloppé dans un ScrollView.)int width = getResources().getDisplayMetrics().widthPixels
onCreateDialog()
. Doit être dedansonResume()
.J'ai fini par remplacer
Fragment.onResume()
et saisir les attributs de la boîte de dialogue sous-jacente, puis y définir les paramètres largeur / hauteur. J'ai défini la hauteur / largeur de la disposition la plus externe surmatch_parent
. Notez que ce code semble également respecter les marges que j'ai définies dans la mise en page XML.la source
(android.view.WindowManager.LayoutParams)
, depuis quoi le diffusez- vous? J'ai été perplexe lors du choix de l'importation correcte pourLayoutParams
apparaître dans les 3 premières lignes de la fonction. J'ai fini par choisir(android.view.WindowManager.LayoutParams)
. Est-ce censé être correct?android.view.WindowManager.LayoutParams
, il est inutile d'utiliser lesViewGroup.LayoutParams
trois lignes ci-dessus ... Vous ne gagnez aucune flexibilité ici. Quoi qu'il en soit, merci pour cette bonne réponse!J'ai eu un DialogFragment de taille fixe définissant ce qui suit dans la mise en page principale XML (LinearLayout dans mon cas):
la source
La seule chose qui a fonctionné dans mon cas était la solution indiquée ici: http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html
Extrait de l'article du blog Adil:
la source
getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
fonctionne parfaitement pour un DialogFragment. Mais je ne comprends pas le contrôle de sécurité. pourquoi devons-nous vérifiernull
?Dialog
(un enfant duDialogFragment
) sera disponible au moment où il est demandé. Il est possible qu'Android renvoie null lorsque nous appelonsgetDialog()
.Une façon de contrôler votre
DialogFragment
largeur et hauteur est de vous assurer que sa boîte de dialogue respecte la largeur et la hauteur de votre vue si leur valeur estWRAP_CONTENT
.En utilisant
ThemeOverlay.AppCompat.Dialog
Un moyen simple d'y parvenir consiste à utiliser le
ThemeOverlay.AppCompat.Dialog
style inclus dans la bibliothèque de support Android.DialogFragment
avecDialog
:DialogFragment
avecAlertDialog
(mise en garde:)minHeight="48dp"
:Vous pouvez également définir
ThemeOverlay.AppCompat.Dialog
comme thème par défaut lors de la création de vos boîtes de dialogue, en l'ajoutant au thème xml de votre application.Faites attention, car de nombreuses boîtes de dialogue ont besoin de la largeur minimale par défaut pour bien paraître.
DialogFragment
avecDialog
, en utilisantandroid:dialogTheme
:DialogFragment
avecAlertDialog
, en utilisantandroid:alertDialogTheme
oualertDialogTheme
(mise en garde:)minHeight="48dp"
:Prime
Sur les API Android plus anciennes, les
Dialog
s semblent avoir des problèmes de largeur, en raison de leur titre (même si vous n'en définissez pas).Si vous ne souhaitez pas utiliser de
ThemeOverlay.AppCompat.Dialog
style et que vousDialog
n'avez pas besoin d'un titre (ou en a un personnalisé), vous pouvez le désactiver:Réponse obsolète, ne fonctionnera pas dans la plupart des cas
J'essayais de faire en sorte que le dialogue respecte la largeur et la hauteur de ma mise en page, sans spécifier de taille fixe par programmation.
Je l'ai compris
android:windowMinWidthMinor
etandroid:windowMinWidthMajor
causais le problème. Même s'ils n'étaient pas inclus dans le thème de monActivity
ouDialog
, ils étaient toujours appliqués auActivity
thème, d'une manière ou d'une autre.J'ai proposé trois solutions possibles.
Solution 1: créez un thème de boîte de dialogue personnalisé et utilisez-le lors de la création de la boîte de dialogue dans le
DialogFragment
.Solution 2: créez un thème personnalisé à utiliser dans un
ContextThemeWrapper
qui servira deContext
dialogue. Utilisez cette option si vous ne souhaitez pas créer de thème de dialogue personnalisé (par exemple, lorsque vous souhaitez utiliser le thème spécifié parandroid:dialogTheme
).Solution 3 (avec un
AlertDialog
): appliquerandroid:windowMinWidthMinor
etandroid:windowMinWidthMajor
entrer dans leContextThemeWrapper
créé par leAlertDialog$Builder
.la source
Theme.MaterialComponents.Light.Dialog
comme parent et j'ai utilisé ce style dans le constructeur deMaterialAlertDialogBuilder
. Je suis tombé sur votre réponse après une recherche d'une heure. Merci et bravo.Gotcha # 13:
DialogFragment
Mise en pageC'est vraiment un engourdissement de l'esprit.
Lors de la création d'un
DialogFragment
, vous pouvez choisir de remplaceronCreateView
(qui transmet unViewGroup
pour attacher votre mise en page .xml) ouonCreateDialog
, ce qui ne le fait pas.Le choix de remplacer
OnCreateDialog
ouOnCreateView
dépend de la manière dont vous comptez utiliser la boîte de dialogue.OnCreateDialog
.OnCreateView
.C'est peut-être la pire chose au monde.
onCreateDialog
FolieDonc, vous remplacez
onCreateDialog
dans votreDialogFragment
pour créer une instance personnalisée deAlertDialog
pour afficher dans une fenêtre. Cool. Mais rappelez-vous,onCreateDialog
ne reçoit pasViewGroup
pour attacher votre mise en page .xml personnalisée . Pas de problème, vous passez simplementnull
à lainflate
méthode.Que la folie commence.
Lorsque vous remplacez
onCreateDialog
, Android IGNORE COMPLÈTEMENT plusieurs attributs du nœud racine de la mise en page .xml que vous gonflez. Cela inclut, mais n'est probablement pas limité à:background_color
layout_gravity
layout_width
layout_height
Juste le mot
DialogFragment
me donne envie de vomir. Je pourrais écrire un roman rempli de pièges et de snafus Android, mais celui-ci est l'un des plus intimes.Pour revenir à la raison, d'abord, nous déclarons un style pour restaurer JUST the
background_color
etlayout_gravity
nous attendons:Le style ci-dessus hérite du thème de base pour Dialogs (dans le
AppCompat
thème de cet exemple).Ensuite, nous appliquons le style par programme pour remettre les valeurs qu'Android vient de jeter de côté et pour restaurer l'
AlertDialog
apparence standard :Le code ci-dessus vous fera
AlertDialog
ressembler àAlertDialog
nouveau. Peut-être que c'est assez bon.Mais attendez, il y a plus!
Si vous cherchez à définir un SPÉCIFIQUE
layout_width
oulayout_height
pour votreAlertDialog
quand il est affiché (très probable), alors devinez quoi, vous n'avez pas encore terminé!L'hilarité continue lorsque vous réalisez que si vous essayez de définir un style spécifique
layout_width
oulayout_height
dans votre nouveau style sophistiqué, Android l'ignorera complètement aussi!:Pour définir une largeur ou une hauteur de fenêtre SPÉCIFIQUE, vous devez vous diriger vers une méthode complète et gérer
LayoutParams
:En résumé
Pour les
DialogFragment
s qui remplacentonCreateDialog
:AlertDialog
aspect et la convivialité standard , créez un style qui définitbackground_color
=transparent
etlayout_gravity
=center
et appliquez ce style dansonCreateDialog
.layout_width
et / ou spécifiquelayout_height
, faites-le par programmeonResume
avecLayoutParams
la source
Quand j'ai besoin d'élargir un peu le DialogFragment, je règle minWidth:
la source
Je ne vois pas une raison impérieuse de passer outre
onResume
ouonStart
de définir la largeur et la hauteur duWindow
sein deDialogFragment
l »Dialog
- ces méthodes du cycle de vie particulier peuvent s'appelé exécuter de façon répétée et sans nécessité que le redimensionnement code plus d'une fois en raison de choses comme la commutation de plusieurs fenêtres, semi- finition puis mise au premier plan de l'application, et ainsi de suite. Les conséquences de cette répétition sont assez insignifiantes, mais pourquoi se contenter de cela?Définir la largeur / hauteur à la place dans une
onActivityCreated()
méthode remplacée sera une amélioration car cette méthode n'est appelée de manière réaliste qu'une seule fois par instance de votreDialogFragment
. Par exemple:Ci-dessus, je viens de définir la largeur
match_parent
indépendamment de l'orientation de l'appareil. Si vous voulez que votre boîte de dialogue de paysage ne soit pas aussi large, vous pouvez vérifier sigetResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
au préalable.la source
La cote dans la disposition la plus externe ne fonctionne pas dans la boîte de dialogue. Vous pouvez ajouter une mise en page où la dimension définie sous la plus extérieure.
la source
Je l'ai corrigé en définissant les paramètres de disposition de l'élément racine.
la source
Voici un moyen de définir la largeur / hauteur de DialogFragment en xml. Enveloppez simplement votre viewHierarchy dans un Framelayout (n'importe quelle mise en page fonctionnera) avec un fond transparent.
Un arrière-plan transparent semble être un indicateur spécial, car il centre automatiquement l'enfant de frameLayout dans la fenêtre lorsque vous faites cela. Vous obtiendrez toujours l'assombrissement en plein écran derrière votre fragment, indiquant que votre fragment est l'élément actif.
la source
Voici la version kotlin
la source
Vous pouvez utiliser le pourcentage pour la largeur.
J'ai utilisé Holo Theme pour cet exemple.
la source
Vous pouvez ci-dessous le code pour définir la largeur et la hauteur de la mise en page à partir de java.
la source
Je crée la boîte de dialogue en utilisant AlertDialog.Builder donc j'ai utilisé la réponse de Rodrigo dans un OnShowListener.
la source
Snicolas
dans la discussion de "DialogFragment
vsAlertDialog
" dans stackoverflow.com/a/7979823/3372061 .Travailler sur Android 6.0, a rencontré le même problème.
AlertDialog
serait défini par défaut sur l'width
ensemble prédéfini dans le thème, quel que soit l'width
ensemble réel dans la racine de la vue personnaliséeLayout
. J'ai pu le faire régler correctement en ajustantwidth
leloading_message
TextView
. Sans chercher plus loin, il semble que le dimensionnement des éléments réels et le fait que la racine lesLayout
entoure le fasse fonctionner comme prévu. Voici une présentation XML d'une boîte de dialogue de chargement qui définitwidth
correctement la boîte de dialogue. Utilisation de cette bibliothèque pour l'animation.la source
Facile et solide:
la source
Dans mon cas,
DialogFragment
occupé la taille de l'activité complète comme unFragment
. LeDialogFragment
était basé sur la mise en page XML, nonAlertDialog
. Mon erreur a été d'ajouter le fragment de dialogue àFragmentManager
un fragment habituel:Au lieu de cela, j'ai besoin
show
du fragment de dialogue:Après quelques modifications (j'ai
ViewPager2
dans la mise en page), le fragment de dialogue est devenu trop étroit:J'ai utilisé la solution de N1hk :
Maintenant, il a défini la largeur et la hauteur, et non la taille totale de l'activité.
Je veux dire sur
onCreateView
etonCreateDialog
. Si vous disposez d'un fragment de dialogue basé sur la mise en page, vous pouvez utiliser l'une de ces 2 méthodes.1) Si vous utilisez
onCreateView
, vous devez utiliseronActivityCreated
pour définir la largeur.2) Si vous utilisez à la
onCreateDialog
place deonCreateView
, vous pouvez y définir des paramètres.onActivityCreated
ne sera pas nécessaire.la source
Dans mon cas, cela a été causé par
align_parentBottom="true"
une vue à l'intérieur d'unRelativeLayout
. Suppression de tous les alignParentBottom et modification de toutes les mises en page en LinearLayouts verticales et le problème a disparu.la source
Définissez la disposition parent de la disposition de dialogue personnalisée sur RelativeLayout , obtenez automatiquement la largeur et la hauteur communes.
la source
L'une des solutions précédentes a presque fonctionné. J'ai essayé quelque chose de légèrement différent et cela a fonctionné pour moi.
(Assurez-vous de regarder sa solution) C'était sa solution .. Cliquez ici Cela a fonctionné sauf pour: builder.getContext (). GetTheme (). ApplyStyle (R.style.Theme_Window_NoMinWidth, true);
Je l'ai changé en
La dernière ligne est ce qui est vraiment différent.
la source
la source
C'est la solution la plus simple
La meilleure solution que j'ai trouvée est de remplacer
onCreateDialog()
au lieu deonCreateView()
. setContentView () définira les dimensions correctes de la fenêtre avant de gonfler. Cela supprime le besoin de stocker / définir une dimension, une couleur d'arrière-plan, un style, etc. dans les fichiers de ressources et de les définir manuellement.la source
Ajoutez à votre
FragmentDialog
:la source
Cela fonctionnera parfaitement.
la source
Pour obtenir une boîte de dialogue qui couvre presque tout le scree: Définissez d'abord une classe ScreenParameter
Ensuite, vous devez appeler le ScreenParamater avant votre méthode getDialog.getWindow (). SetLayout ()
la source