Mam kilka fragmentów, które muszą pokazywać zwykłe okno dialogowe. W tych oknach dialogowych użytkownik może wybrać odpowiedź tak / nie, a następnie fragment powinien odpowiednio się zachowywać.
Teraz Fragment
klasa nie ma onCreateDialog()
metody do przesłonięcia, więc myślę, że muszę zaimplementować okna dialogowe na zewnątrz, w pliku zawierającym Activity
. W porządku, ale potem Activity
trzeba jakoś zgłosić wybraną odpowiedź do fragmentu. Mógłbym oczywiście użyć tutaj wzorca wywołania zwrotnego, więc fragment rejestruje się w Activity
klasie słuchacza, a Activity zgłosi odpowiedź przez to lub coś w tym stylu.
Ale wydaje się, że to dość duży bałagan jak na proste zadanie, takie jak wyświetlanie „prostego” dialogu tak-nie we fragmencie. W ten sposób Fragment
byłbym mniej samowystarczalny.
Czy jest na to jakiś czystszy sposób?
Edytować:
Odpowiedź na to pytanie nie wyjaśnia szczegółowo, w jaki sposób należy używać DialogFragments do wyświetlania okien dialogowych z fragmentów. AFAIK, droga do zrobienia to:
- Wyświetl fragment.
- W razie potrzeby Utwórz wystąpienie DialogFragment.
- Ustaw oryginalny fragment jako obiekt docelowy tego DialogFragment za pomocą
.setTargetFragment()
. - Pokaż DialogFragment z .show () z oryginalnego fragmentu.
- Gdy użytkownik wybierze jakąś opcję w tym DialogFragment, powiadom oryginalny Fragment o tym wyborze (np. Użytkownik kliknął „tak”), możesz uzyskać referencję do oryginalnego fragmentu za pomocą .getTarget ().
- Odrzuć DialogFragment.
źródło
Odpowiedzi:
Zamiast tego należy użyć DialogFragment .
źródło
Activity
całkowitego odwoływania się do tego , używając metodputFragment
i , umożliwiając raportowanie bezpośrednio do wywołującego fragmentu (nawet po zmianie orientacji).getFragment
FragmentManager
DialogFragment
Muszę ostrożnie wątpić w wcześniej zaakceptowaną odpowiedź, że użycie DialogFragment jest najlepszą opcją. Wydaje się, że zamierzonym (głównym) celem DialogFragment jest wyświetlanie fragmentów, które same są oknami dialogowymi, a nie wyświetlanie fragmentów, które mają okna dialogowe do wyświetlenia.
Uważam, że wykorzystanie aktywności fragmentu do pośredniczenia między dialogiem a fragmentem jest opcją preferowaną.
źródło
onCreateDialog
podejście managed dialogs ( ) wkrótce zostanie wycofane, nie zgodziłbym się z tym i powiedziałbym, żeDialogFragment
jest to właściwy sposób.Oto pełny przykład tak / nie DialogFragment:
Klasa:
Aby rozpocząć okno dialogowe:
Możesz również pozwolić klasie zaimplementować onClickListener i użyć tego zamiast wbudowanych detektorów.
Callback to Activity
Jeśli chcesz zaimplementować callback, oto jak to się robi w Twojej aktywności:
i
Klasa wywołania zwrotnego:
Następnie, aby wykonać wywołanie zwrotne z fragmentu, musisz upewnić się, że słuchacz jest dołączony w następujący sposób:
A oddzwonienie jest wykonywane w ten sposób:
źródło
Dla mnie było to:
MyFragment:
MyDialog:
Czynność:
Układ DialogFragment:
Jak nazwa
dialogfragment_heightfixhiddenbtn
wskazuje, po prostu nie mogłem znaleźć sposobu na naprawienie tego, że wysokość dolnego przycisku została zmniejszona o połowę, pomimo tego, że powiedziałemwrap_content
, więc zamiast tego dodałem ukryty przycisk do „przecięcia” na pół. Przepraszam za włamanie.źródło
setTargetFragment()
jest poprawnie odtwarzany przez system po ponownym uruchomieniu zestawu Aktywności / Fragmentu po obróceniu. Tak więc odniesienie automatycznie wskaże nowy cel.public interface ShowDialog { void showDialog(DialogFragment dialogFragment); }
gdzie .test_dialog ma niestandardowy XML
źródło
Sam jestem początkującym i szczerze nie mogłem znaleźć satysfakcjonującej odpowiedzi, którą mógłbym zrozumieć lub wdrożyć.
Oto link zewnętrzny, który naprawdę pomógł mi osiągnąć to, co chciałem. Jest to bardzo proste i łatwe do naśladowania.
http://www.helloandroid.com/tutorials/how-display-custom-dialog-your-android-application
TO, CO PRÓBOWAŁEM OSIĄGNĄĆ Z KODEM:
Mam MainActivity, który obsługuje fragment. Chciałem, aby na górze układu pojawiło się okno dialogowe z prośbą o wprowadzenie danych przez użytkownika, a następnie odpowiednie przetworzenie danych wejściowych. Zobacz zrzut ekranu
Oto, jak wygląda onCreateView mojego fragmentu
Mam nadzieję, że ci to pomoże
Daj mi znać, jeśli jest jakieś zamieszanie. :)
źródło
źródło