Korzystam z DialogFragments do wielu rzeczy: wybieranie pozycji z listy, wprowadzanie tekstu.
Jaki jest najlepszy sposób na zwrócenie wartości (tj. Łańcucha lub elementu z listy) z powrotem do działania / fragmentu wywołującego?
Obecnie wprowadzam działanie wywołujące DismissListener
i przekazuję DialogFragment odwołanie do działania. Dialog wywołuje następnie OnDimiss
metodę w działaniu, a działanie pobiera wynik z obiektu DialogFragment. Bardzo niechlujny i nie działa przy zmianie konfiguracji (zmianie orientacji), ponieważ DialogFragment traci odniesienie do działania.
Dziękuję za wszelką pomoc.
Activity
i teDialogFragment
mogą zostać odtworzone. Korzystanie zActivity
przekazanego doonAttach(Activity activity)
jest właściwym i zalecanym sposobem.Odpowiedzi:
Użyj
myDialogFragment.setTargetFragment(this, MY_REQUEST_CODE)
z miejsca, w którym wyświetlasz okno dialogowe, a następnie po zakończeniu okna dialogowego, możesz z niego zadzwonićgetTargetFragment().onActivityResult(getTargetRequestCode(), ...)
i zaimplementowaćonActivityResult()
w zawierającym go fragmencie.Wydaje się, że jest to nadużycie
onActivityResult()
, zwłaszcza, że w ogóle nie obejmuje działań. Ale widziałem to zalecane przez oficjalnych ludzi z Google, a może nawet w wersjach API. Myślę, że po tog/setTargetFragment()
zostały dodane.źródło
Jak widać tutaj , jest to bardzo prosty sposób.
W twojej
DialogFragment
dodać detektor interfejsu, takich jak:Następnie dodaj odwołanie do tego odbiornika:
Będzie to wykorzystane do „aktywacji” metod detektora, a także do sprawdzenia, czy działanie nadrzędne / fragment implementuje ten interfejs (patrz poniżej).
W
Activity
/FragmentActivity
/Fragment
że „wywołał”DialogFragment
prostu zaimplementuj ten interfejs.W
DialogFragment
sumie musisz dodać w punkcie, w którym chcesz odrzucićDialogFragment
i zwrócić wynik:Gdzie
mEditText.getText().toString()
jest to, co zostanie przekazane z powrotem do połączeniaActivity
.Zauważ, że jeśli chcesz zwrócić coś innego, po prostu zmień argumenty, które przyjmuje słuchacz.
Na koniec powinieneś sprawdzić, czy interfejs został faktycznie zaimplementowany przez działanie / fragment nadrzędny:
Ta technika jest bardzo elastyczna i pozwala oddzwonić z wynikiem, nawet jeśli nie chcesz jeszcze zamknąć okna dialogowego.
źródło
Activity
„iFragmentActivity
”, ale jeśli dzwoniący toFragment
?Fragment
.Fragment
, możesz zrobić kilka rzeczy: 1. Przekaż fragment jako odniesienie (może nie być dobrym pomysłem, ponieważ możesz spowodować wyciek pamięci). 2. UżyjFragmentManager
i wezwaniefindFragmentById
lubfindFragmentByTag
będzie się fragmenty, które istnieją w swojej działalności. Mam nadzieję, że to pomogło. Miłego dnia!setTargetFragment()
igetTargetFragment()
są magiczne.Istnieje znacznie prostszy sposób otrzymania wyniku z DialogFragment.
Po pierwsze, w swojej Aktywności, Fragmentie lub FragmentActivity musisz dodać następujące informacje:
Jest
requestCode
to w zasadzie twoja etykieta int dla DialogFragment, który wywołałeś, pokażę, jak to działa za sekundę. ResultCode to kod, który odsyłasz z DialogFragment, informujący o bieżącym działaniu oczekującym, fragmencie lub fragmentActivity.Następnym fragmentem kodu, który należy wprowadzić, jest wywołanie DialogFragment. Przykład jest tutaj:
Za pomocą tych trzech wierszy deklarujesz swój DialogFragment, ustawiając requestCode (który wywoła onActivityResult (...) po zamknięciu Dialogu, a następnie wyświetlasz okno dialogowe. To takie proste.
Teraz w DialogFragment musisz tylko dodać jeden wiersz bezpośrednio przed nim
dismiss()
, aby wysłać wynik z powrotem do onActivityResult ().Otóż to. Uwaga, wynik jest zdefiniowany jako
int resultCode
ustawionyresultCode = 1;
w tym przypadku.To wszystko, możesz teraz wysłać wynik DialogFragment z powrotem do swojej aktywności wywołującej, fragmentu lub aktywności fragmentu.
Wygląda na to, że ta informacja została wcześniej opublikowana, ale nie podano wystarczającego przykładu, więc pomyślałem, że podam więcej szczegółów.
EDIT 06.24.2016 Przepraszam za wprowadzający w błąd kod powyżej. Ale z pewnością nie możesz otrzymać wyniku z powrotem do działania, widząc to jako linię:
wyznacza cel,
Fragment
a nieActivity
. Aby to zrobić, musisz użyć implementacjiInterfaceCommunicator
.W twoim
DialogFragment
zestawie zmienna globalnaUtwórz funkcję publiczną, aby ją obsłużyć
Wtedy, gdy jesteś gotowy do wysłania kodu z powrotem do
Activity
kiedyDialogFragment
odbywa działa, po prostu dodaj linię przed wamidismiss();
swoimiDialogFragment
:W swojej działalności musisz teraz zrobić dwie rzeczy, po pierwsze, usunąć ten jeden wiersz kodu, który nie ma już zastosowania:
Następnie zaimplementuj interfejs i gotowe. Możesz to zrobić, dodając następujący wiersz do
implements
klauzuli na samej górze klasy:A potem
@Override
funkcja w działaniu,Używasz tej metody interfejsu tak samo, jak
onActivityResult()
metody. Z wyjątkiem tego, że metoda interfejsu służy do,DialogFragments
a druga doFragments
.źródło
dialogFrag.setTargetFragment(this, 1)
z działania, ale ta metoda otrzymuje fragment jako pierwszy argument, więc nie można go rzucić. Czy mam rację ?@Override public void onAttach(Context context) { super.onAttach(context); yourInterface = (YourInterface) context; }
Cóż, może już być za późno na odpowiedź, ale oto, co zrobiłem, aby uzyskać wyniki z
DialogFragment
. bardzo podobny do odpowiedzi @ brandon. DzwonięDialogFragment
z fragmentu, po prostu umieść ten kod w miejscu, w którym wywołujesz okno dialogowe.gdzie
categoryDialog
jest mój, doDialogFragment
którego chcę zadzwonić, a następnie w swojej implementacjidialogfragment
umieść ten kod w miejscu, w którym zamierzasz ustawić swoje dane. WartośćresultCode
1 można ustawić lub użyć opcji Zdefiniowane przez system.teraz czas wrócić do fragmentu wywołującego i zaimplementować tę metodę. sprawdzenia prawidłowości danych lub spowodować sukces, jeśli chcesz się
resultCode
irequestCode
jeśli warunek.źródło
Inne podejście, aby umożliwić Fragmentowi komunikowanie się aż do jego Aktywności :
1) Zdefiniuj interfejs publiczny we fragmencie i utwórz dla niego zmienną
2) Rzuć aktywność na zmienną mCallback we fragmencie
3) Zaimplementuj detektor w swojej działalności
4) Zastąp OnFragmentInteraction w działaniu
Więcej informacji na ten temat: https://developer.android.com/training/basics/fragments/communicating.html
źródło
public void onAttach
fragment i wykonać tam castingZnalazłem jeden prosty sposób: Zaimplementuj to jest twoje okno dialogowe Fragment,
A następnie w działaniu, które wywołało Fragment Dialogu, utwórz odpowiednią funkcję jako taką:
Toast ma pokazać, że działa. Pracował dla mnie.
źródło
Interface
niż twarde połączenie z klasami betonu.Jestem bardzo zaskoczony, widząc, że nikt nie zasugerował wykorzystania lokalnych transmisji
DialogFragment
doActivity
komunikacji! Uważam, że jest o wiele prostsze i czystsze niż inne sugestie. Zasadniczo rejestrujesz się,Activity
aby wysłuchać transmisji i wysyłasz transmisje lokalne ze swoichDialogFragment
wystąpień. Prosty. Aby dowiedzieć się, jak to wszystko skonfigurować, zobacz krok po kroku. Zobacz tutaj .źródło
Lub udostępnij ViewModel jak pokazano tutaj:
https://developer.android.com/topic/libraries/architecture/viewmodel#sharing_data_between_fragments
źródło
W moim przypadku musiałem przekazać argumenty do elementu docelowego. Ale dostałem wyjątek „Fragment już aktywny”. Zadeklarowałem więc interfejs w moim DialogFragment, który został zaimplementowany w ParentFragment. Gdy ParentFragment uruchomił DialogFragment, ustawia się jako TargetFragment. Następnie w DialogFragment zadzwoniłem
źródło
W Kotlinie
// Moja aktywność
Mam nadzieję, że to działa, jeśli możesz to poprawić, edytuj. Mój angielski nie jest zbyt dobry
źródło
jeśli chcesz wysłać argumenty i otrzymać wynik z drugiego fragmentu, możesz użyć Fragment.setArguments, aby wykonać to zadanie
źródło
Aby mieć to jako jedną z opcji (ponieważ nikt jeszcze o tym nie wspominał) - możesz użyć autobusu zdarzeń takiego jak Otto. W oknie dialogowym wykonujesz:
Poproś abonenta (działanie lub fragment), aby go subskrybował:
źródło