Istnieje znacznie prostszy sposób otrzymania wyniku z DialogFragment.
Po pierwsze, w swojej Aktywności, Fragmentie lub FragmentActivity musisz dodać następujące informacje:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// Stuff to do, dependent on requestCode and resultCode
if(requestCode == 1) { // 1 is an arbitrary number, can be any int
// This is the return result of your DialogFragment
if(resultCode == 1) { // 1 is an arbitrary number, can be any int
// Now do what you need to do after the dialog dismisses.
}
}
}
Jest requestCodeto 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:
DialogFragment dialogFrag = new MyDialogFragment();
// This is the requestCode that you are sending.
dialogFrag.setTargetFragment(this, 1);
// This is the tag, "dialog" being sent.
dialogFrag.show(getFragmentManager(), "dialog");
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 ().
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();
Otóż to. Uwaga, wynik jest zdefiniowany jako int resultCodeustawiony resultCode = 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ę:
dialogFrag.setTargetFragment(this, 1);
wyznacza cel, Fragmenta nie Activity. Aby to zrobić, musisz użyć implementacji InterfaceCommunicator.
W twoim DialogFragmentzestawie zmienna globalna
public InterfaceCommunicator interfaceCommunicator;
Utwórz funkcję publiczną, aby ją obsłużyć
public interface InterfaceCommunicator {
void sendRequestCode(int code);
}
Wtedy, gdy jesteś gotowy do wysłania kodu z powrotem do Activitykiedy DialogFragmentodbywa działa, po prostu dodaj linię przed wami dismiss();swoimi DialogFragment:
interfaceCommunicator.sendRequestCode(1); // the parameter is any int code you choose.
W swojej działalności musisz teraz zrobić dwie rzeczy, po pierwsze, usunąć ten jeden wiersz kodu, który nie ma już zastosowania:
dialogFrag.setTargetFragment(this, 1);
Następnie zaimplementuj interfejs i gotowe. Możesz to zrobić, dodając następujący wiersz do implementsklauzuli na samej górze klasy:
public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator
A potem @Overridefunkcja w działaniu,
@Override
public void sendRequestCode(int code) {
// your code here
}
Używasz tej metody interfejsu tak samo, jak onActivityResult()metody. Z wyjątkiem tego, że metoda interfejsu służy do, DialogFragmentsa druga do Fragments.