Określam układ mojego DialogFragment w pliku układu xml (nazwijmy go layout_mydialogfragment.xml
), a szczególnie jego atrybuty layout_width
i layout_height
( 100dp
powiedzmy każdy). Następnie zawyżam ten układ w metodzie DialogFragment w onCreateView(...)
następujący sposób:
View view = inflater.inflate(R.layout.layout_mydialogfragment, container, false);
Niestety stwierdzam, że kiedy pojawia się moje okno dialogowe (DialogFragment), nie jest ono zgodne z layout_width
i layout_height
określone w jego pliku układu xml (a moje okno dialogowe zmniejsza się lub rozszerza w zależności od zawartości). Czy ktoś wie, czy lub jak mogę sprawić, by moje okno dialogowe przestrzegało layout_width
i layout_height
określone w pliku układu XML? W tej chwili muszę ponownie określić szerokość i wysokość mojego okna dialogowego w metodzie mojego DialogFragment w onResume()
następujący sposób ...
getDialog().getWindow().setLayout(width, height);
... A zatem, niechcący, należy pamiętać o przyszłych zmianach szerokości i wysokości okna dialogowego w dwóch miejscach.
źródło
Odpowiedzi:
Jeśli konwertujesz bezpośrednio z wartości zasobów:
Następnie określ match_parent w swoim układzie okna dialogowego:
Musisz martwić się tylko o jedno miejsce (umieść je w swoim
DialogFragment#onResume
). Nie jest doskonały, ale przynajmniej działa w przypadku posiadania RelativeLayout jako katalogu głównego pliku układu twojego okna dialogowego.źródło
RelativeLayout
i to mi pomogło. Wielkie dzięki za rozwiązanie - zaoszczędziło mi to dużo czasu.onResume()
, nieonCreateView()
. (Mój układ główny to RelativeLayout opakowany w ScrollView.)int width = getResources().getDisplayMetrics().widthPixels
onCreateDialog()
. Musi być w środkuonResume()
.Skończyło się na nadpisywaniu
Fragment.onResume()
i przechwytywaniu atrybutów z podstawowego okna dialogowego, a następnie ustawianiu tam parametrów szerokości / wysokości. Ustawiłem zewnętrzną wysokość / szerokość układu namatch_parent
. Zauważ, że ten kod wydaje się uwzględniać również marginesy, które zdefiniowałem w układzie XML.źródło
(android.view.WindowManager.LayoutParams)
, z jakiego miejsca to przesyłasz? Zaskoczyło mnie wybranie prawidłowego importu doLayoutParams
pojawienia się w pierwszych 3 wierszach funkcji. Skończyło się na wyborze(android.view.WindowManager.LayoutParams)
. Czy to ma być poprawne?android.view.WindowManager.LayoutParams
, nie ma sensu używaćViewGroup.LayoutParams
trzech linii powyżej ... Nie zyskujesz tutaj żadnej elastyczności. Cokolwiek, dziękuję za tę dobrą odpowiedź!Mam stały rozmiar DialogFragment definiujący następujące elementy w głównym układzie XML (w moim przypadku LinearLayout):
źródło
Jedyne, co zadziałało w moim przypadku, to rozwiązanie wskazane tutaj: http://adilatwork.blogspot.mx/2012/11/android-dialogfragment-dialog-sizing.html
Fragment z posta na blogu Adil:
źródło
getDialog().getWindow().setLayout(dialogWidth, dialogHeight);
działa idealnie w przypadku DialogFragment. Ale nie rozumiem kontroli bezpieczeństwa. dlaczego musimy to sprawdzićnull
?Dialog
(element podrzędnyDialogFragment
) będzie dostępny w żądanym czasie. Możliwe, że Android zwróci wartość null, gdy zadzwonimygetDialog()
.Jednym ze sposobów kontrolowania
DialogFragment
szerokości i wysokości jest upewnienie się, że okno dialogowe uwzględnia szerokość i wysokość widoku, jeśli ich wartość toWRAP_CONTENT
.Za pomocą
ThemeOverlay.AppCompat.Dialog
Prostym sposobem na osiągnięcie tego jest użycie
ThemeOverlay.AppCompat.Dialog
stylu zawartego w bibliotece obsługi systemu Android.DialogFragment
zDialog
:DialogFragment
zAlertDialog
(zastrzeżenie:)minHeight="48dp"
:Możesz także ustawić
ThemeOverlay.AppCompat.Dialog
jako domyślny motyw podczas tworzenia okien dialogowych, dodając go do motywu xml swojej aplikacji.Uważaj, ponieważ wiele okien dialogowych wymaga domyślnej minimalnej szerokości, aby dobrze wyglądać.
DialogFragment
zDialog
wykorzystaniemandroid:dialogTheme
:DialogFragment
zAlertDialog
, korzystając zandroid:alertDialogTheme
oralertDialogTheme
(ostrzeżenie:)minHeight="48dp"
:Premia
W starszych interfejsach API systemu Android
Dialog
wydaje się, że mają pewne problemy z szerokością, ze względu na ich tytuł (nawet jeśli go nie ustawisz).Jeśli nie chcesz używać
ThemeOverlay.AppCompat.Dialog
stylu iDialog
nie potrzebujesz tytułu (lub masz niestandardowy), możesz go wyłączyć:Nieaktualna odpowiedź, w większości przypadków nie zadziała
Starałem się, aby okno dialogowe uwzględniało szerokość i wysokość mojego układu, bez programowego określania stałego rozmiaru.
Doszedłem do tego
android:windowMinWidthMinor
iandroid:windowMinWidthMajor
spowodowałem problem. Mimo że nie były one zawarte w temacie mojegoActivity
lub , w jakiś sposóbDialog
nadal były do niego stosowaneActivity
.Wymyśliłem trzy możliwe rozwiązania.
Rozwiązanie 1: utwórz niestandardowy motyw okna dialogowego i użyj go podczas tworzenia okna dialogowego w
DialogFragment
.Rozwiązanie 2: stworzenie własnego motywu być używany w
ContextThemeWrapper
które będą służyć jakoContext
dla okna. Użyj tego, jeśli nie chcesz tworzyć niestandardowego motywu okna dialogowego (na przykład, gdy chcesz użyć motywu określonego przezandroid:dialogTheme
).Rozwiązanie 3 (z
AlertDialog
): wymuśandroid:windowMinWidthMinor
iandroid:windowMinWidthMajor
doContextThemeWrapper
utworzonego przezAlertDialog$Builder
.źródło
Theme.MaterialComponents.Light.Dialog
jako rodzic i użyłem tego stylu w konstruktorzeMaterialAlertDialogBuilder
. Natknąłem się na twoją odpowiedź po 1 godzinie badań. Dzięki i kciuki w górę.Gotcha # 13:
DialogFragment
LayoutsTo naprawdę paraliżujące.
Podczas tworzenia
DialogFragment
możesz wybrać nadpisanieonCreateView
(co przekazuje a,ViewGroup
aby dołączyć układ .xml) lubonCreateDialog
, co nie.Wybór, czy nadpisać,
OnCreateDialog
czyOnCreateView
zależy od tego, jak zamierzasz używać okna dialogowego.OnCreateDialog
.OnCreateView
.To prawdopodobnie najgorsza rzecz na świecie.
onCreateDialog
NiepoczytalnośćTak więc nadpisujesz
onCreateDialog
w swoim,DialogFragment
aby utworzyć niestandardową instancjęAlertDialog
do wyświetlenia w oknie. Chłodny. Należy jednak pamiętać,onCreateDialog
otrzyma nieViewGroup
dołączyć swój zwyczaj .xml układ do . Nie ma problemu, po prostu przechodzisznull
doinflate
metody.Niech rozpocznie się szaleństwo.
Podczas zastępowania system
onCreateDialog
Android CAŁKOWICIE IGNORUJE kilka atrybutów węzła głównego układu .xml, który nadmuchujesz. Obejmuje to, ale prawdopodobnie nie ogranicza się do:background_color
layout_gravity
layout_width
layout_height
Już samo słowo
DialogFragment
sprawia, że mam ochotę zwymiotować. Mógłbym napisać powieść pełną problemów z Androidem i snafusem, ale ta jest jedną z najbardziej ukrytych.Aby wrócić do zdrowia psychicznego, najpierw deklarujemy styl przywracania TYLKO
background_color
ilayout_gravity
oczekujemy:Powyższy styl dziedziczy z motywu podstawowego dla okien dialogowych (w
AppCompat
motywie w tym przykładzie).Następnie programowo stosujemy styl, aby przywrócić wartości, które Android właśnie odrzucił, i przywrócić standardowy
AlertDialog
wygląd i styl:Powyższy kod sprawi, że będziesz
AlertDialog
wyglądaćAlertDialog
ponownie. Może to wystarczy.Ale czekaj, jest więcej!
Jeśli szukasz, aby ustawić specyficzny
layout_width
lublayout_height
na TwójAlertDialog
kiedy to pokazane (bardzo prawdopodobne), to wiecie co, to nie jest jeszcze gotowe!Radość trwa, gdy zdajesz sobie sprawę, że jeśli spróbujesz ustawić konkretny
layout_width
lublayout_height
w swoim nowym, wymyślnym stylu, Android całkowicie to zignoruje !:Aby ustawić SZCZEGÓLNĄ szerokość lub wysokość okna, musisz przejść do całej metody i poradzić sobie z
LayoutParams
:W podsumowaniu
Z
DialogFragment
tego powoduonCreateDialog
:AlertDialog
wygląd i styl, utwórz styl, który ustawiabackground_color
=transparent
ilayout_gravity
=center
i zastosuj ten styl w programieonCreateDialog
.layout_width
i / lublayout_height
, zrobić programowo wonResume
zLayoutParams
źródło
Kiedy potrzebuję poszerzyć DialogFragment, ustawiam minWidth:
źródło
Nie widzę powód, aby zastąpić
onResume
lubonStart
ustawić szerokość i wysokośćWindow
wDialogFragment
„sDialog
- te szczególne metody cyklu życia może się wielokrotnie i niepotrzebnie nazywa wykonać to zmiana rozmiaru kodu więcej niż raz z powodu wielu rzeczy, takich jak okna przełączania, w tło następnie ustawianie aplikacji na pierwszym planie i tak dalej. Konsekwencje tego powtórzenia są dość błahe, ale po co się na tym godzić?Zamiast tego ustawienie szerokości / wysokości w ramach zastąpionej
onActivityCreated()
metody będzie ulepszeniem, ponieważ ta metoda jest realistycznie wywoływana tylko raz na instancjęDialogFragment
. Na przykład:Powyżej ustawiłem szerokość
match_parent
niezależnie od orientacji urządzenia. Jeśli chcesz, aby okno dialogowe krajobrazu nie było tak szerokie, możeszgetResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
wcześniej sprawdzić, czy .źródło
Wymiar w układzie zewnętrznym nie działa w oknie dialogowym. Możesz dodać układ, w którym ustaw wymiar poniżej najbardziej zewnętrznego.
źródło
Naprawiłem to ustawiając parametry układu głównego elementu.
źródło
Oto sposób ustawienia szerokości / wysokości DialogFragment w xml. Po prostu zawiń swój viewHierarchy w Framelayout (każdy układ będzie działał) z przezroczystym tłem.
Przezroczyste tło wydaje się być specjalną flagą, ponieważ automatycznie wyśrodkowuje element potomny frameLayout w oknie, gdy to zrobisz. Nadal będziesz mieć pełny ekran przyciemniony za swoim fragmentem, co oznacza, że Twój fragment jest aktywnym elementem.
źródło
Oto wersja Kotlin
źródło
Możesz użyć wartości procentowej dla szerokości.
W tym przykładzie użyłem Holo Theme.
źródło
Możesz poniżej kodu ustawić szerokość i wysokość układu z java.
źródło
Tworzę okno dialogowe za pomocą AlertDialog.Builder, więc użyłem odpowiedzi Rodrigo w OnShowListener.
źródło
Snicolas
w dyskusji na temat „DialogFragment
vsAlertDialog
” na stackoverflow.com/a/7979823/3372061 .Pracując na Androidzie 6.0, napotkałem ten sam problem.
AlertDialog
będzie domyślniewidth
ustawiać wstępnie zdefiniowany zestaw w kompozycji, niezależnie od rzeczywistegowidth
zestawu w katalogu głównym widoku niestandardowegoLayout
. Udało mi się dostać to, aby ustawić odpowiednio regulującwidth
zloading_message
TextView
. Bez dalszych badań wydaje się, że wymiarowanie rzeczywistych elementów iLayout
zawijanie wokół nich korzenia sprawia, że działa zgodnie z oczekiwaniami. Poniżej znajduje się układ XML okna dialogowego ładowania, którywidth
prawidłowo ustawia okno dialogowe. Wykorzystanie tej biblioteki do animacji.źródło
Łatwe i solidne:
źródło
W moim przypadku
DialogFragment
zajęty pełny rozmiar działalności, taki jak aFragment
.DialogFragment
Został oparty na XML-układ nieAlertDialog
. Moim błędem było dodanie fragmentu okna dialogowegoFragmentManager
jako zwykłego fragmentu:Zamiast tego potrzebuję
show
fragmentu dialogu:Po edycji (mam
ViewPager2
w układzie) fragment okna dialogowego stał się zbyt wąski:Użyłem rozwiązania N1hk :
Teraz ma zdefiniowaną szerokość i wysokość, a nie pełny rozmiar aktywności.
Chcę powiedzieć o
onCreateView
ionCreateDialog
. Jeśli masz fragment okna dialogowego oparty na układzie, możesz użyć dowolnej z tych dwóch metod.1) Jeśli używasz
onCreateView
, powinieneś użyćonActivityCreated
do ustawienia szerokości.2) Jeśli używasz
onCreateDialog
zamiastonCreateView
, możesz ustawić tam parametry.onActivityCreated
nie będą potrzebne.źródło
W moim przypadku było to spowodowane
align_parentBottom="true"
widokiem wnętrza aRelativeLayout
. Usunięto wszystkie alignParentBottom i zmieniono wszystkie układy na pionowe LinearLayouts i problem zniknął.źródło
Ustaw nadrzędny układ niestandardowego układu dialogowego na RelativeLayout , automatycznie uzyskaj wspólną szerokość i wysokość.
źródło
Jedno z wcześniejszych rozwiązań prawie zadziałało. Spróbowałem czegoś nieco innego i ostatecznie mi się to udało.
(Upewnij się, że spojrzałeś na jego rozwiązanie) To było jego rozwiązanie ... Kliknij tutaj . Zadziałało z wyjątkiem: builder.getContext (). GetTheme (). ApplyStyle (R.style.Theme_Window_NoMinWidth, true);
Zmieniłem to na
Ostatnia linia jest naprawdę inna.
źródło
źródło
To najprostsze rozwiązanie
Najlepszym rozwiązaniem, jakie znalazłem, jest zastąpienie
onCreateDialog()
zamiastonCreateView()
. setContentView () ustawi poprawne wymiary okna przed zawyżeniem. Eliminuje potrzebę przechowywania / ustawiania wymiaru, koloru tła, stylu itp. W plikach zasobów i ustawiania ich ręcznie.źródło
Dodaj do
FragmentDialog
:źródło
To zadziała idealnie.
źródło
Aby uzyskać okno dialogowe obejmujące prawie cały osypisko: Najpierw zdefiniuj klasę ScreenParameter
Następnie musisz wywołać ScreenParamater przed metodą getDialog.getWindow (). SetLayout ()
źródło