Google zaleca używanie DialogFragment
zamiast zwykłego Dialog
za pomocą Fragments API
, ale absurdalne jest używanie izolowanego DialogFragment
prostego pola z komunikatem potwierdzającym Tak-Nie. Jaka jest najlepsza praktyka w tym przypadku?
244
Dialog
lubAlertDialog.Builder::create()::show()
utworzy okno dialogowe, które zniknie po obróceniu ekranu.Odpowiedzi:
Tak, użyj
DialogFragment
ionCreateDialog
możesz po prostu użyć kreatora AlertDialog, aby utworzyć proste zaAlertDialog
pomocą przycisków potwierdzenia Tak / Nie. W ogóle niezbyt dużo kodu.Jeśli chodzi o obsługę zdarzeń w twoim fragmencie, byłyby na to różne sposoby, ale po prostu definiuję komunikat
Handler
w moimFragment
, przekazuję go doDialogFragment
jego konstruktora, a następnie przekazuję wiadomości z powrotem do modułu obsługi mojego fragmentu jako odpowiedni dla różnych zdarzeń kliknięcia. Znów różne sposoby na zrobienie tego, ale dla mnie działają następujące.W oknie dialogowym przytrzymaj komunikat i utwórz go w konstruktorze:
Zaimplementuj
onClickListener
w oknie dialogowym, a następnie odpowiednio wywołaj moduł obsługi:Edytować
I jak w przypadku
Message
przesyłki, możesz ją zapisaćonSaveInstanceState
i przywrócićNastępnie w
onCreate
źródło
target
który będzie zerowy, jeśli załadujesz go z pakietu. Jeśli cel komunikatu jest pusty i użyjesz gosendToTarget
, otrzymasz wyjątek NullPointerException - nie dlatego, że komunikat jest pusty, ale dlatego, że jego celem jest.Możesz tworzyć ogólne podklasy DialogFragment, takie jak YesNoDialog i OkDialog, i przekazywać tytuł i wiadomość, jeśli często używasz okien dialogowych w swojej aplikacji.
Następnie zadzwoń, używając:
I obsłuż wynik
onActivityResult
.źródło
YES_NO_CALL
,getFragmentManager()
ionActivityResult
?YES_NO_CALL
to niestandardowy int, który jest kodem żądania.getFragmentManager()
pobiera menedżera fragmentów dla działania ionActivityResult()
jest metodą wywołania zwrotnego cyklu życia fragmentu.Użyj DialogFragment zamiast AlertDialog:
Od czasu wprowadzenia interfejsu API na poziomie 13 :
ShowDialog metodę z aktywności jest niezalecane . Wywołanie okna dialogowego w innym miejscu w kodzie nie jest wskazane, ponieważ będziesz musiał samodzielnie zarządzać oknem dialogowym (np. Zmiana orientacji).
Różnica DialogFragment - AlertDialog
Czy są tak bardzo różni? Od referencji Androida dotyczących DialogFragment :
Inne notatki
źródło
Poleciłbym użyć
DialogFragment
.Oczywiście utworzenie z nim okna dialogowego „Tak / Nie” jest dość skomplikowane, biorąc pod uwagę, że powinno to być dość proste zadanie, ale utworzenie podobnego okna dialogowego
Dialog
jest zaskakująco skomplikowane.(Cykl życia działania komplikuje sprawę - musisz pozwolić
Activity
zarządzać cyklem życia okna dialogowego - i nie ma możliwości przekazania parametrów niestandardowych, np. Niestandardowego komunikatu,Activity.showDialog
jeśli używasz poziomów API poniżej 8)Zaletą jest to, że zazwyczaj łatwo można zbudować własną abstrakcję
DialogFragment
.źródło
String
parametr. Na przykład, gdy użytkownik kliknie „Tak”, okno dialogowe wywołuje metodę działania z parametrem „zgoda”. Parametry te są określone podczas wyświetlania okna dialogowego, na przykład AskDialog.ask („Czy zgadzasz się na te warunki?”, „Zgadzasz się”, „nie zgadzam się”);FragmentManager
„sfindFragmentByTag
. Ale tak, wymaga sporo kodu.Fragment
this
i miećActivity
extends
swójInterface
. Ostrożnie wątkując, możesz odskakiwać wywołania interfejsu, gdy niekoniecznie chcesz je mieć, jeśli twoja współbieżność nie jest w ryzach. Nie jestem jednak pewien, co to robi z pamięcią i spaghetti z zależnością od koła, czy ktoś inny chciałby się do niego włączyć? Inną opcją jestMessage
/,Handler
ale nadal możesz mieć problemy z współbieżnością.Ogólny AlertDialogFragment ze wzorem konstruktora
W moim projekcie wykorzystałem
AlertDialog.Builder
już dużo, zanim dowiedziałem się, że to problematyczne. Nie chciałem jednak zmieniać tak dużo kodu nigdzie w mojej aplikacji. Dodatkowo, tak naprawdę jestem fanem przechodzącOnClickListeners
jako anonimowych klas, gdzie są one potrzebne (czyli podczas używaniasetPositiveButton()
,setNegativeButton()
itd.) Zamiast realizować tysiące metod wywołania zwrotnego do komunikowania się między fragmentem dialogowym i fragment uchwytu, który może w moim zdaniem prowadzi do bardzo zagmatwanego i złożonego kodu. Zwłaszcza jeśli masz wiele różnych okien dialogowych w jednym fragmencie, a następnie musisz rozróżnić w implementacjach wywołania zwrotnego, pomiędzy którymi okno dialogowe jest aktualnie wyświetlane.Dlatego połączyłem różne podejścia, aby stworzyć ogólną
AlertDialogFragment
klasę pomocnika, której można używać dokładnie tak, jakAlertDialog
:ROZWIĄZANIE
( PROSZĘ PAMIĘTAĆ, że używam wyrażeń lambda Java 8 w moim kodzie, więc może być konieczna zmiana części kodu, jeśli jeszcze nie używasz wyrażeń lambda ).
STOSOWANIE
Zamieszczam to tutaj nie tylko po to, by podzielić się moim rozwiązaniem, ale także dlatego, że chciałem zapytać was ludzi o opinię: czy takie podejście jest do pewnego stopnia uzasadnione czy problematyczne?
źródło
Czy mogę zasugerować trochę uproszczenia odpowiedzi @ ashishduh:
Eliminuje to potrzebę zaznajomienia użytkownika (klasy) z elementami wewnętrznymi komponentu i sprawia, że korzystanie z niego jest naprawdę proste:
PS W moim przypadku potrzebowałem prostego okna dialogowego z ostrzeżeniem, więc to właśnie stworzyłem. Możesz zastosować podejście do Tak / Nie lub innego potrzebnego rodzaju.
źródło
Użyj okna dialogowego do prostych okien dialogowych tak lub nie.
Gdy potrzebujesz bardziej skomplikowanych widoków, w których potrzebujesz uzyskać kontrolę nad cyklem życia, takich jak oncreate, żądania uprawnień, dowolne zastąpienie cyklu życia, użyłbym fragmentu okna dialogowego. W ten sposób oddzielasz uprawnienia i każdy inny kod, który okno dialogowe musi obsługiwać bez konieczności komunikowania się z działaniem wywołującym.
źródło