Ich spezifiziere das Layout meines DialogFragments in einer XML-Layoutdatei (nennen wir es layout_mydialogfragment.xml
) und seine layout_width
und layout_height
Attribute besonders (um es 100dp
jeweils zu sagen). Ich blase dieses Layout dann in der onCreateView(...)
Methode meines DialogFragments wie folgt auf:
View view = inflater.inflate(R.layout.layout_mydialogfragment, container, false);
Leider stelle ich fest, dass mein Dialogfeld (DialogFragment) das in seiner XML-Layoutdatei angegebene layout_width
und layout_height
angegebene nicht berücksichtigt (und mein Dialogfeld je nach Inhalt unterschiedlich verkleinert oder erweitert wird). Weiß jemand, ob oder wie ich meinen Dialog dazu bringen kann, das zu respektieren layout_width
und layout_height
in seiner XML-Layoutdatei anzugeben? Im Moment muss ich die Breite und Höhe meines Dialogs in der onResume()
Methode meines DialogFragments wie folgt erneut angeben ...
getDialog().getWindow().setLayout(width, height);
... Und daher müssen Sie in unerwünschter Weise daran denken, zukünftige Änderungen an der Breite und Höhe des Dialogfelds an zwei Stellen vorzunehmen.
quelle
Antworten:
Wenn Sie direkt aus Ressourcenwerten konvertieren:
Geben Sie dann in Ihrem Layout match_parent für den Dialog an:
Sie müssen sich nur um einen Ort kümmern (platzieren Sie ihn in Ihrem
DialogFragment#onResume
). Es ist nicht perfekt, aber es funktioniert zumindest, wenn ein RelativeLayout als Stamm der Layoutdatei Ihres Dialogfelds verwendet wird.quelle
RelativeLayout
und es hat mir geholfen. Vielen Dank für die Lösung - das hat mir viel Zeit gespart.onResume()
, nichtonCreateView()
. (Mein Root-Layout ist RelativeLayout in einer ScrollView.)int width = getResources().getDisplayMetrics().widthPixels
onCreateDialog()
. Muss in seinonResume()
.Fragment.onResume()
Am Ende habe ich die Attribute aus dem zugrunde liegenden Dialogfeld überschrieben und abgerufen und dort die Parameter für Breite / Höhe festgelegt. Ich stelle die äußerste Layouthöhe / -breite auf einmatch_parent
. Beachten Sie, dass dieser Code anscheinend auch die Ränder berücksichtigt, die ich im XML-Layout definiert habe.quelle
(android.view.WindowManager.LayoutParams)
, woraus werfen Sie es? Ich war verwirrt, als ich den richtigen Import fürLayoutParams
die ersten drei Zeilen der Funktion auswählte. Am Ende wählen(android.view.WindowManager.LayoutParams)
. Soll das richtig sein?android.view.WindowManager.LayoutParams
, ist es sinnlos,ViewGroup.LayoutParams
drei Zeilen oben zu verwenden ... Sie gewinnen hier keine Flexibilität. Wie auch immer, danke für diese gute Antwort!Ich habe ein DialogFragment mit fester Größe erhalten, das Folgendes im XML-Hauptlayout definiert (in meinem Fall LinearLayout):
quelle
Das einzige, was in meinem Fall funktioniert hat, war die hier aufgezeigte Lösung: http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html
Ausschnitt aus dem Adil-Blogbeitrag:
quelle
getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
funktioniert perfekt für ein DialogFragment. Aber ich verstehe die Sicherheitsüberprüfung nicht. warum müssen wir überprüfennull
?Dialog
(ein Kind vonDialogFragment
) zum gewünschten Zeitpunkt verfügbar ist. Es ist möglich, dass Android beim Aufruf null zurückgibtgetDialog()
.Eine Möglichkeit, die
DialogFragment
Breite und Höhe Ihrer Ansicht zu steuern , besteht darin, sicherzustellen, dass der Dialog die Breite und Höhe Ihrer Ansicht berücksichtigt, wenn deren Wert gleich istWRAP_CONTENT
.Verwenden von
ThemeOverlay.AppCompat.Dialog
Eine einfache Möglichkeit, dies zu erreichen, besteht darin
ThemeOverlay.AppCompat.Dialog
, den in der Android Support Library enthaltenen Stil zu verwenden.DialogFragment
mitDialog
:DialogFragment
mitAlertDialog
(Einschränkung :)minHeight="48dp"
:Sie können
ThemeOverlay.AppCompat.Dialog
beim Erstellen Ihrer Dialoge auch das Standarddesign festlegen , indem Sie es dem XML-Design Ihrer App hinzufügen.Seien Sie vorsichtig, da viele Dialoge die Standard-Mindestbreite benötigen, um gut auszusehen.
DialogFragment
mitDialog
, Gebrauch machen vonandroid:dialogTheme
:DialogFragment
mitAlertDialog
, unter Verwendung vonandroid:alertDialogTheme
oderalertDialogTheme
(Vorbehalt:minHeight="48dp"
):Bonus
Bei älteren Android-APIs
Dialog
scheinen s aufgrund ihres Titels einige Probleme mit der Breite zu haben (auch wenn Sie keine festlegen).Wenn Sie keinen
ThemeOverlay.AppCompat.Dialog
Stil verwenden möchten undDialog
keinen Titel benötigen (oder einen benutzerdefinierten haben), möchten Sie ihn möglicherweise deaktivieren:Veraltete Antwort funktioniert in den meisten Fällen nicht
Ich habe versucht, den Dialog so zu gestalten, dass er die Breite und Höhe meines Layouts berücksichtigt, ohne programmgesteuert eine feste Größe anzugeben.
Ich habe das herausgefunden
android:windowMinWidthMinor
undandroid:windowMinWidthMajor
das Problem verursacht. Obwohl sie nicht in meinemActivity
oder meinem Thema enthalten waren, wurden sie irgendwieDialog
immer noch auf dasActivity
Thema angewendet .Ich habe drei mögliche Lösungen gefunden.
Lösung 1: Erstellen Sie ein benutzerdefiniertes Dialogthema und verwenden Sie es beim Erstellen des Dialogfelds in der
DialogFragment
.Lösung 2: Erstellen Sie ein benutzerdefiniertes Thema, das in einem verwendet
ContextThemeWrapper
werden soll, das alsContext
Dialogfeld dient. Verwenden Sie diese Option, wenn Sie kein benutzerdefiniertes Dialogthema erstellen möchten (z. B. wenn Sie das durch angegebene Thema verwenden möchtenandroid:dialogTheme
).Lösung 3 (mit einem
AlertDialog
): erzwingenandroid:windowMinWidthMinor
undandroid:windowMinWidthMajor
in dieContextThemeWrapper
von derAlertDialog$Builder
.quelle
Theme.MaterialComponents.Light.Dialog
als Eltern verwendet und diesen Stil im Konstruktor von verwendetMaterialAlertDialogBuilder
. Stolperte über Ihre Antwort nach einer Recherche von 1 Stunde. Danke und Daumen hoch.Gotcha # 13:
DialogFragment
LayoutsEs ist wirklich eine Art betäubender Geist.
Beim Erstellen von a
DialogFragment
können Sie wählen, ob Sie überschreiben möchtenonCreateView
(was aViewGroup
zum Anhängen Ihres XML-Layouts übergibt ) oderonCreateDialog
nicht.Die Wahl, ob überschrieben werden soll
OnCreateDialog
oder nicht,OnCreateView
hängt davon ab, wie Sie den Dialog verwenden möchten.OnCreateDialog
.OnCreateView
.Dies ist möglicherweise das Schlimmste auf der Welt.
onCreateDialog
WahnsinnSie überschreiben also
onCreateDialog
IhreDialogFragment
, um eine angepasste Instanz fürAlertDialog
die Anzeige in einem Fenster zu erstellen . Cool. Aber denken Sie daran,onCreateDialog
erhält nichtViewGroup
Ihre Gewohnheit befestigen .xml Layout an . Kein Problem, Sie gehen einfachnull
zuminflate
Methode.Lasst den Wahnsinn beginnen.
Wenn Sie überschreiben
onCreateDialog
, ignoriert Android VOLLSTÄNDIG mehrere Attribute des Stammknotens des von Ihnen aufgeblasenen XML-Layouts . Dies beinhaltet, ist aber wahrscheinlich nicht beschränkt auf:background_color
layout_gravity
layout_width
layout_height
Allein das Wort
DialogFragment
bringt mich dazu zu kotzen. Ich könnte einen Roman schreiben, der mit Android-Fallstricken und Snafus gefüllt ist, aber dieser ist einer der innersten.Um zur Vernunft zurückzukehren, erklären wir zunächst einen Stil, um NUR das wiederherzustellen,
background_color
undlayout_gravity
wir erwarten:Der obige Stil erbt vom Basisthema für Dialoge (im
AppCompat
Thema in diesem Beispiel).Als Nächstes wenden wir den Stil programmgesteuert an, um die Werte, die Android gerade beiseite geworfen hat, zurückzusetzen und das Standard-Erscheinungsbild wiederherzustellen
AlertDialog
:Der obige Code lässt Sie
AlertDialog
wieder wie ein aussehenAlertDialog
. Vielleicht ist das gut genug.Aber warte, da ist noch mehr!
Wenn Sie eine SPEZIFISCHE
layout_width
oderlayout_height
für Ihre festlegen möchtenAlertDialog
wenn es (sehr wahrscheinlich) gezeigt ist, dann erraten , was ist man noch nicht fertig!Die Heiterkeit setzt sich fort, wenn Sie feststellen, dass Android dies auch völlig ignoriert, wenn Sie versuchen, einen bestimmten
layout_width
oderlayout_height
einen neuen Stil festzulegen!:Um eine SPEZIFISCHE Fensterbreite oder -höhe festzulegen, müssen Sie zu einer ganz anderen Methode übergehen und sich mit Folgendem befassen
LayoutParams
:Zusammenfassend
Für
DialogFragment
s, die überschreibenonCreateDialog
:AlertDialog
Erstellen Sie einen Stil, derbackground_color
=transparent
undlayout_gravity
= setzt,center
und wenden Sie diesen Stil an, um das Standard-Erscheinungsbild wiederherzustellenonCreateDialog
.layout_width
und / oderlayout_height
festzulegen, tun Sie dies programmgesteuertonResume
mitLayoutParams
quelle
Wenn ich das DialogFragment etwas breiter machen muss, setze ich minWidth:
quelle
Ich sehe keinen zwingenden Grund außer Kraft zu setzen
onResume
oderonStart
die Breite und Höhe des setzenWindow
innerhalbDialogFragment
‚sDialog
- diese besonderen Lebenszyklus - Methoden aufgerufen wiederholt bekommen können und unnötig ausführen , dass Code mehr als einmal wegen Dingen wie Multi - Fenster Schalen Ändern der Größe, Backgrounding dann Vordergrund der App und so weiter. Die Konsequenzen dieser Wiederholung sind ziemlich trivial, aber warum sollten Sie sich damit zufrieden geben?Das Festlegen der Breite / Höhe stattdessen innerhalb einer überschriebenen
onActivityCreated()
Methode ist eine Verbesserung, da diese Methode realistischerweise nur einmal pro Instanz von Ihnen aufgerufen wirdDialogFragment
. Beispielsweise:Oben habe ich nur die Breite so eingestellt, dass sie
match_parent
unabhängig von der Geräteorientierung ist. Wenn Ihr Landschaftsdialog nicht so breit sein soll, können SiegetResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
vorher prüfen, ob .quelle
Die Dimension im äußersten Layout funktioniert im Dialog nicht. Sie können ein Layout hinzufügen, bei dem die Dimension unterhalb der äußersten festgelegt ist.
quelle
Ich habe es behoben, indem ich die Layoutparameter des Stammelements festgelegt habe.
quelle
Hier ist eine Möglichkeit, die Breite / Höhe von DialogFragment in XML festzulegen. Wickeln Sie einfach Ihre viewHierarchy in ein Framelayout (jedes Layout funktioniert) mit einem transparenten Hintergrund.
Ein transparenter Hintergrund scheint ein besonderes Flag zu sein, da er das untergeordnete Element des frameLayout dabei automatisch im Fenster zentriert. Sie werden immer noch die Vollbild-Verdunkelung hinter Ihrem Fragment sehen, was darauf hinweist, dass Ihr Fragment das aktive Element ist.
quelle
Hier ist die Kotlin-Version
quelle
Sie können den Prozentsatz für die Breite verwenden.
Ich habe Holo Theme für dieses Beispiel verwendet.
quelle
Sie können den folgenden Code verwenden, um die Breite und Höhe des Layouts in Java festzulegen.
quelle
Ich erstelle den Dialog mit AlertDialog.Builder, also habe ich Rodrigos Antwort in einem OnShowListener verwendet.
quelle
Snicolas
in der Diskussion von "DialogFragment
vsAlertDialog
" in stackoverflow.com/a/7979823/3372061 .Bei der Arbeit mit Android 6.0 ist das gleiche Problem aufgetreten.
AlertDialog
Standardmäßig wird ein vordefinierterwidth
Satz im Design verwendet, unabhängig vom tatsächlichenwidth
Satz im Stammverzeichnis der benutzerdefinierten AnsichtLayout
. Ich war in der Lage , um es richtig zu setzen die Einstellungwidth
derloading_message
TextView
. Ohne weitere Untersuchungen durchzuführen, scheint es so zu sein, dass die Größe der tatsächlichen Elemente und dasLayout
Umwickeln mit der Wurzel wie erwartet funktioniert. Unten finden Sie ein XML-Layout eines Ladedialogs,width
in dem der Dialog korrekt eingestellt ist. Verwenden dieser Bibliothek für die Animation.quelle
Einfach und solide:
quelle
In meinem Fall wurde es durch
align_parentBottom="true"
einen Blick in ein gegebenRelativeLayout
. Alle alignParentBottom's wurden entfernt und alle Layouts in vertikale LinearLayouts geändert. Das Problem ist behoben.quelle
Stellen Sie das übergeordnete Layout des benutzerdefinierten Dialoglayouts auf RelativeLayout ein und ermitteln Sie automatisch die allgemeine Breite und Höhe.
quelle
Eine der früheren Lösungen hat fast funktioniert. Ich habe etwas anderes ausprobiert und es hat bei mir funktioniert.
( Stellen Sie sicher, dass Sie sich seine Lösung ansehen.) Dies war seine Lösung. Klicken Sie hier. Es funktionierte mit Ausnahme von: builder.getContext (). GetTheme (). ApplyStyle (R.style.Theme_Window_NoMinWidth, true);
Ich habe es geändert in
Die letzte Zeile ist wirklich anders.
quelle
In meinem Fall
DialogFragment
besetzte volle Aktivitätsgröße wie einFragment
. DasDialogFragment
basierte auf XML-Layout, nichtAlertDialog
. Mein Fehler war das Hinzufügen des Dialogfragments zuFragmentManager
einem normalen Fragment:Stattdessen muss ich zum
show
Dialogfragment:Nach einiger Bearbeitung (ich habe
ViewPager2
im Layout) wurde das Dialogfragment zu schmal:Ich habe die Lösung von N1hk verwendet :
Jetzt hat es Breite und Höhe definiert, nicht die volle Aktivitätsgröße.
Ich möchte über
onCreateView
und sagenonCreateDialog
. Wenn Sie ein auf dem Layout basierendes Dialogfragment haben, können Sie eine dieser beiden Methoden verwenden.1) Wenn Sie verwenden
onCreateView
, sollten Sie verwendenonActivityCreated
, um die Breite einzustellen.2) Wenn Sie
onCreateDialog
anstelle von verwendenonCreateView
, können Sie dort Parameter einstellen.onActivityCreated
wird nicht benötigt.quelle
quelle
Dies ist die einfachste Lösung
Die beste Lösung, die ich gefunden habe, ist das Überschreiben
onCreateDialog()
anstelle vononCreateView()
. setContentView () legt vor dem Aufblasen die richtigen Fensterabmessungen fest. Es entfällt die Notwendigkeit, eine Dimension, Hintergrundfarbe, einen Stil usw. in Ressourcendateien zu speichern / festzulegen und manuell festzulegen.quelle
Fügen Sie Ihrem hinzu
FragmentDialog
:quelle
Dies wird perfekt funktionieren.
quelle
So erhalten Sie einen Dialog, der fast das gesamte Geröll abdeckt: Definieren Sie zunächst eine ScreenParameter-Klasse
Dann müssen Sie den ScreenParamater vor Ihrer Methode getDialog.getWindow (). SetLayout () aufrufen
quelle