Es gibt eine viel einfachere Möglichkeit, ein Ergebnis von einem DialogFragment zu erhalten.
Zunächst müssen Sie in Ihrer Aktivität, Ihrem Fragment oder Ihrer FragmentAktivität die folgenden Informationen hinzufügen:
@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.
}
}
}
Das requestCode
ist im Grunde Ihre int-Bezeichnung für das von Ihnen aufgerufene DialogFragment. Ich werde gleich zeigen, wie dies funktioniert. Der resultCode ist der Code, den Sie vom DialogFragment zurücksenden und der Ihrer aktuell wartenden Aktivität, Fragment oder FragmentActivity mitteilt, was passiert ist.
Der nächste Code ist der Aufruf des DialogFragments. Ein Beispiel ist hier:
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");
Mit diesen drei Zeilen deklarieren Sie Ihr DialogFragment und legen einen requestCode fest (der das onActivityResult (...) aufruft, sobald der Dialog geschlossen wird, und Sie zeigen dann den Dialog an. So einfach ist das.
Jetzt müssen Sie in Ihrem DialogFragment nur eine Zeile direkt vor dem hinzufügen dismiss()
, damit Sie einen resultCode an onActivityResult () zurücksenden.
getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, getActivity().getIntent());
dismiss();
Das ist es. Beachten Sie, dass der resultCode so definiert ist, wie int resultCode
ich ihn resultCode = 1;
in diesem Fall festgelegt habe.
Jetzt können Sie das Ergebnis Ihres DialogFragments an Ihre aufrufende Aktivität, Fragment oder FragmentActivity zurücksenden.
Es sieht auch so aus, als ob diese Informationen bereits veröffentlicht wurden, aber es wurde kein ausreichendes Beispiel angegeben, sodass ich dachte, ich würde mehr Details liefern.
EDIT 24.06.2016
Ich entschuldige mich für den irreführenden Code oben. Aber Sie können das Ergebnis mit Sicherheit nicht an die Aktivität zurückgeben, die als Linie betrachtet wird:
dialogFrag.setTargetFragment(this, 1);
setzt ein Ziel Fragment
und nicht Activity
. Um dies zu tun, müssen Sie ein implementieren InterfaceCommunicator
.
In Ihrem DialogFragment
Set eine globale Variable
public InterfaceCommunicator interfaceCommunicator;
Erstellen Sie eine öffentliche Funktion, um damit umzugehen
public interface InterfaceCommunicator {
void sendRequestCode(int code);
}
Dann , wenn Sie bereit sind , den Code wieder in die senden , Activity
wenn die DialogFragment
Lauf getan wird, fügen Sie einfach die Linie , bevor Sie dismiss();
Ihre DialogFragment
:
interfaceCommunicator.sendRequestCode(1); // the parameter is any int code you choose.
In Ihrer Aktivität müssen Sie jetzt zwei Dinge tun: Die erste besteht darin, die eine Codezeile zu entfernen, die nicht mehr anwendbar ist:
dialogFrag.setTargetFragment(this, 1);
Dann implementieren Sie die Schnittstelle und Sie sind fertig. Sie können dies tun, indem Sie der implements
Klausel ganz oben in Ihrer Klasse die folgende Zeile hinzufügen :
public class MyClass Activity implements MyDialogFragment.InterfaceCommunicator
Und dann @Override
die Funktion in der Aktivität,
@Override
public void sendRequestCode(int code) {
// your code here
}
Sie verwenden diese Schnittstellenmethode genauso wie die onActivityResult()
Methode. Außer die Schnittstellenmethode ist für DialogFragments
und die andere ist für Fragments
.