Próbuję pokazać prawie pełny ekran DialogFragment. Ale jakoś nie jestem w stanie tego zrobić.
Sposób, w jaki pokazuję fragment, pochodzi bezpośrednio z dokumentacji programisty Androida
FragmentManager f = ((Activity)getContext()).getFragmentManager();
FragmentTransaction ft = f.beginTransaction();
Fragment prev = f.findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack(null);
// Create and show the dialog.
DialogFragment newFragment = new DetailsDialogFragment();
newFragment.show(ft, "dialog");
Wiem, że naiwnie próbowałem ustawić RelativeLayout we fragmencie na fill_parent i trochę minWidth i minHeight.
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:minWidth="1000px"
android:minHeight="600px"
android:background="#ff0000">
Wiedziałbym, że spodziewam się, że DialogFragment wypełni większość ekranu. Ale wydaje mi się, że zmieniam rozmiar tylko w pionie, ale tylko do pewnej stałej szerokości w poziomie.
Próbowałem też ustawić atrybuty okna w kodzie, jak zasugerowałem tutaj: http://groups.google.com/group/android-developers/browse_thread/thread/f0bb813f643604ec . Ale to też nie pomogło.
Prawdopodobnie nie rozumiem czegoś o tym, jak Android obsługuje dialogi, ponieważ jestem w tym zupełnie nowy. Jak mogę zrobić coś takiego? Czy są jakieś alternatywne sposoby osiągnięcia celu?
Urządzenie z systemem Android:
Asus EeePad Transformer
Android 3.0.1
Aktualizacja: udało mi się teraz wyświetlić go na pełnym ekranie, z następującym kodem we fragmencie
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_FRAME, android.R.style.Theme_Holo_Light);
}
Niestety, nie bardzo chcę tego. Zdecydowanie potrzebuję małego „wypełnienia” wokół okna dialogowego, aby wyświetlić tło.
Jakieś pomysły, jak to osiągnąć?
Odpowiedzi:
Spróbuj przełączyć się na
LinearLayout
zamiastRelativeLayout
. Podczas testowania celowałem w interfejs API 3.0 Honeycomb.i układy : fragment_dialog.xml
main.xml
źródło
Aby uzyskać DialogFragment na pełnym ekranie
Zastąp
onStart
swój DialogFragment w następujący sposób:I bardzo dziękuję za ten post: The-mystery-of-androids-full-screen-dialog-fragments
źródło
ViewGroup.LayoutParams.WRAP_CONTENT
na wysokość. Dzięki.źródło
Zgodnie z tym linkiem na pełnym ekranie DialogFragment pokazuje wypełnienie po bokach, co będzie działać jak urok.
źródło
Utwórz DialogFragment na pełnym ekranie, używając tylko stylu
Pierwsze rozwiązanie
1. Dodaj do
style.xml
:2. Dodaj do swojego DialogFragment:
Alternatywne rozwiązanie
gdzie
AppTheme
jest temat zdefiniowany w stylach.źródło
W moim przypadku zastosowałem następujące podejście:
Plus LinearLayout, aby wypełnić całą przestrzeń treścią.
Jednak na niektórych urządzeniach Lollipop + (np. Nexus 9) między lewą i prawą krawędzią okna dialogowego a krawędziami ekranu nadal były niewielkie przerwy .
Nie było to oczywiste, ale w końcu doszedłem do wniosku, że aby uzyskać pełną szerokość na wszystkich urządzeniach i platformach, tło okna powinno być określone w pliku styles.xml, jak poniżej:
I oczywiście ten styl musi być używany podczas tworzenia okna dialogowego, takiego jak poniżej:
źródło
<item name="android:windowFullscreen">true</item> <item name="android:windowIsFloating">false</item>
Źródło: TechRepublicWcześniej napotkałem ten problem podczas korzystania z pełnoekranowego okna dialogowegoFragment: zawsze występuje wypełnienie podczas ustawiania pełnego ekranu. wypróbuj ten kod w metodzie onActivityCreated () programu dialogFragment:
źródło
Jeśli chodzi o zaktualizowanie interfejsu API systemu Android, sugerowana metoda wyświetlania okna dialogowego na pełnym ekranie jest następująca:
w przeciwnym razie, jeśli nie chcesz, aby był wyświetlany na pełnym ekranie, możesz to zrobić w ten sposób:
Mam nadzieję, że to pomoże.
EDYTOWAĆ
Miej świadomość, że rozwiązanie, które podałem, działa, ale ma słabość, która czasami może być kłopotliwa. Dodanie DialogFragment do
android.R.id.content
kontenera nie pozwoli na obsługęDialogFragment#setCancelable()
poprawną funkcji i może prowadzić do nieoczekiwanych zachowań podczas dodawania samego DialogFragment do tylnego stosu.Dlatego zasugerowałem ci prostą zmianę stylu twojego DialogFragment w metodzie onCreate w następujący sposób:
Mam nadzieję, że to pomoże.
źródło
Spróbuj użyć setStyle () w onCreate i przesłonić onCreateDialog zrobić okno dialogowe bez tytułu
lub po prostu nadpisuj onCreate () i setStyle obok kodu.
źródło
Rzeczywiście może to zależeć od tego, jak zdefiniowano układ. Aby jednak upewnić się, że okno dialogowe uzyska wymagany rozmiar, najlepszym rozwiązaniem jest dostarczenie LayoutParams po wyświetleniu okna (a nie podczas tworzenia). W DialogFragment okno dialogowe jest wyświetlane w metodzie onStart , więc prawidłową metodą uzyskania pełnej szerokości jest:
Aby zapewnić również motyw lub styl, na przykład styl NO_TITLE, najlepszą lokalizacją jest metoda onCreate :
źródło
Uwaga: tutaj nawet można znaleźć właściwą odpowiedź. Ale chcę wyjaśnić zamieszanie.
Użyj poniższego kodu dla
android.app.DialogFragment
Użyj poniższego kodu dla
android.support.v4.app.DialogFragment
źródło
I wersja kotlin!
źródło
Oto rozwiązanie, w jaki sposób rozwiązałem ten problem:
źródło
Utwórz poniższy motyw w swoim style.xml:
następnie ustaw styl w DialogFragment
źródło
Chirag Nagariya ma rację, z wyjątkiem dodatku „_Fullscreen”. można go rozwiązać przy użyciu dowolnego stylu podstawowego, który nie pochodzi ze stylu okna dialogowego. Można również użyć „android.R.style.Theme_Black_NoTitleBar”.
źródło
Na wypadek, gdyby ktoś inny się z tym spotkał, miałem podobne doświadczenie, ale okazuje się, że problem polegał na tym, że zapomniałem zwrócić zawyżonego widoku z onCreateView (zamiast tego zwracałem domyślny super.onCreateView). Po prostu zwróciłem poprawny zawyżony widok i to rozwiązało problem.
źródło
To rozwiązanie stosuje motyw pełnoekranowy w oknie dialogowym, który jest podobny do setStyle Chiraga w onCreate. Wadą jest to, że nie jest używany parametr saveInstanceState.
źródło
Spróbuj tego dla wspólnego okna dialogowego fragmentów do wielu zastosowań. Mam nadzieję, że to pomoże ci obstawiającym
źródło
Oto, co musisz ustawić na fragmentację:
W Twoim przypadku:
I dlaczego? Ponieważ DialogFragment (jeśli nie zostanie to wyraźnie powiedziane), użyje swoich wewnętrznych stylów, które zawiną w nim Twój niestandardowy układ (bez pełnego ekranu itp.).
A układ? Nie jest potrzebny żaden hackerski sposób, to działa dobrze:
Cieszyć się
źródło
Jestem bardzo spóźniony na odpowiedź na to pytanie, ale nadal chcę udostępnić tę odpowiedź, aby w przyszłości każdy mógł z niej skorzystać.
Użyłem tego kodu w moim projekcie, działa on zarówno w wersji niższej, jak i wyższej.
Po prostu użyj tego motywu wewnątrz onCreateDialog () w następujący sposób:
android.R.style.Theme_Black_NoTitleBar_Fullscreen - Oto kod źródłowy tego motywu, możesz zobaczyć, że tylko ten motyw wystarczy, aby DialogFragment pojawił się na pełnym ekranie.
Daj mi znać, jeśli ktoś napotka jakiś problem. Mam nadzieję, że to jest pomocne. Dzięki :)
źródło
Poniższy sposób zadziała, nawet jeśli pracujesz nad względnym układem. Wykonaj następujące kroki:
Przejdź do styles.xml, a następnie pod właśnie dodanym motywem dodaj te dwa atrybuty:
Moje ustawienie motywu dla okna dialogowego jest następujące:
Upewnij się, że motyw ma element nadrzędny jako Theme.AppCompat.Dialog Innym sposobem byłoby po prostu utworzenie nowego stylu w styles.xml i zmiana go zgodnie z powyższym kodem.
Idź do swojej klasy Dialog Fragment i do onCreate () ustaw styl swojego okna dialogowego na:
@Override public void onCreate (@Nullable Bundle allowedInstanceState) {super.onCreate (saveInstanceState); setStyle (DialogFragment.STYLE_NORMAL, R.style.DialogTheme); }
źródło
Dodaj poniższe linie w stylu pełnego okna dialogowego.
źródło
window.setLayout
za mało dla starszych urządzeń.Oto co robię:
źródło
źródło
Rozwiązaniem wykorzystującym nowe
ConstraintLayout
jest zawijanieConstraintLayout
aLinearLayout
ze stałą wartością minHeight i minWidth. Bez zawijania ConstraintLayout nie uzyskuje odpowiedniego rozmiaru dla okna dialogowego.źródło
Pracował dla mnie w Kotlinie,
źródło
poniższe rozwiązanie działało u mnie inne rozwiązanie dało mi trochę miejsca po bokach, tj. nie na pełnym ekranie
Musisz wprowadzić zmiany w metodzie onStart i onCreate
źródło