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 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:
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 resultCode
ustawiony 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, Fragment
a nie Activity
. Aby to zrobić, musisz użyć implementacji InterfaceCommunicator
.
W twoim DialogFragment
zestawie 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 Activity
kiedy DialogFragment
odbywa 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 implements
klauzuli na samej górze klasy:
public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator
A potem @Override
funkcja 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, DialogFragments
a druga do Fragments
.