Ich verwende DialogFragments für eine Reihe von Dingen: Auswahl eines Elements aus der Liste, Eingabe von Text.
Was ist der beste Weg, um einen Wert (dh eine Zeichenfolge oder ein Element aus einer Liste) an die aufrufende Aktivität / das aufrufende Fragment zurückzugeben?
Derzeit DismissListener
lasse ich die aufrufende Aktivität implementieren und gebe dem DialogFragment einen Verweis auf die Aktivität. Der Dialog ruft dann die OnDimiss
Methode in der Aktivität auf und die Aktivität erfasst das Ergebnis aus dem DialogFragment-Objekt. Sehr chaotisch und funktioniert nicht bei Konfigurationsänderungen (Orientierungsänderungen), da das DialogFragment den Verweis auf die Aktivität verliert.
Vielen Dank für jede Hilfe.
Activity
als auch dasDialogFragment
möglicherweise neu erstellt werden. Die Verwendung desActivity
Passed toonAttach(Activity activity)
ist der richtige und empfohlene Weg.Antworten:
Verwenden
myDialogFragment.setTargetFragment(this, MY_REQUEST_CODE)
Sie diese Option an der Stelle, an der Sie den Dialog anzeigen. Wenn Ihr Dialog beendet ist, können Sie sie aufrufengetTargetFragment().onActivityResult(getTargetRequestCode(), ...)
undonActivityResult()
im enthaltenen Fragment implementieren .Es scheint ein Missbrauch von zu sein
onActivityResult()
, zumal es überhaupt keine Aktivitäten beinhaltet. Aber ich habe gesehen, dass es von offiziellen Google-Leuten empfohlen wurde, und vielleicht sogar in den API-Demos. Ich denke, es ist das, wofürg/setTargetFragment()
hinzugefügt wurde.quelle
Wie Sie hier sehen können , gibt es einen sehr einfachen Weg, dies zu tun.
Fügen
DialogFragment
Sie in Ihrem Interface einen Listener hinzu wie:Fügen Sie dann einen Verweis auf diesen Listener hinzu:
Dies wird verwendet, um die Listener-Methode (n) zu "aktivieren" und um zu überprüfen, ob die übergeordnete Aktivität / das übergeordnete Fragment diese Schnittstelle implementiert (siehe unten).
In der
Activity
/FragmentActivity
/Fragment
das „genannt“ dieDialogFragment
Umsetzung einfach diese Schnittstelle.In Ihrem
DialogFragment
alles , was Sie an dem Punkt hinzufügen müssen , wo Sie die entlassen möchtenDialogFragment
und das Ergebnis zurück , ist dies:Wo
mEditText.getText().toString()
ist, was an die Berufung zurückgegeben wirdActivity
.Beachten Sie, dass Sie, wenn Sie etwas anderes zurückgeben möchten, einfach die Argumente ändern, die der Listener verwendet.
Schließlich sollten Sie überprüfen, ob die Schnittstelle tatsächlich von der übergeordneten Aktivität / dem übergeordneten Fragment implementiert wurde:
Diese Technik ist sehr flexibel und ermöglicht das Zurückrufen mit dem Ergebnis, auch wenn Sie den Dialog noch nicht schließen möchten.
quelle
Activity
's undFragmentActivity
' s, aber wenn ist der Anrufer einFragment
?Fragment
.Fragment
war, können Sie einige Dinge tun: 1. Übergeben Sie das Fragment als Referenz (möglicherweise keine gute Idee, da Sie möglicherweise Speicherlecks verursachen). 2. Verwenden Sie dasFragmentManager
und rufen Sie auffindFragmentById
oderfindFragmentByTag
es werden die Fragmente abgerufen, die in Ihrer Aktivität vorhanden sind. Ich hoffe es hat geholfen. Ich wünsche ihnen einen wunderbaren Tag!setTargetFragment()
undgetTargetFragment()
sind magisch.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:
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:
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.Das ist es. Beachten Sie, dass der resultCode so definiert ist, wie
int resultCode
ich ihnresultCode = 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:
setzt ein Ziel
Fragment
und nichtActivity
. Um dies zu tun, müssen Sie ein implementierenInterfaceCommunicator
.In Ihrem
DialogFragment
Set eine globale VariableErstellen Sie eine öffentliche Funktion, um damit umzugehen
Dann , wenn Sie bereit sind , den Code wieder in die senden ,
Activity
wenn dieDialogFragment
Lauf getan wird, fügen Sie einfach die Linie , bevor Siedismiss();
IhreDialogFragment
: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:
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 :Und dann
@Override
die Funktion in der Aktivität,Sie verwenden diese Schnittstellenmethode genauso wie die
onActivityResult()
Methode. Außer die Schnittstellenmethode ist fürDialogFragments
und die andere ist fürFragments
.quelle
dialogFrag.setTargetFragment(this, 1)
von einer Aktivität aus aufrufen , aber diese Methode erhält ein Fragment als erstes Argument, sodass dies nicht umgewandelt werden konnte. Habe ich recht ?@Override public void onAttach(Context context) { super.onAttach(context); yourInterface = (YourInterface) context; }
Nun, es ist vielleicht zu spät, um zu antworten, aber hier ist, was ich getan habe, um Ergebnisse von der zurück zu bekommen
DialogFragment
. sehr ähnlich zu @ brandons Antwort. Hier rufe ichDialogFragment
von einem Fragment aus an, platziere diesen Code einfach dort, wo du deinen Dialog aufrufst.Wo
categoryDialog
ist meine,DialogFragment
die ich anrufen möchte und danach in Ihrer Implementierungdialogfragment
platzieren Sie diesen Code, wo Sie Ihre Daten in Absicht setzen. Der Wert vonresultCode
ist 1, Sie können ihn festlegen oder systemdefiniert verwenden.Jetzt ist es an der Zeit, zum aufrufenden Fragment zurückzukehren und diese Methode zu implementieren. Überprüfen Sie die Gültigkeit der Daten oder den Erfolg der Ergebnisse, wenn Sie dies mit
resultCode
undrequestCode
in der if-Bedingung wünschen .quelle
Unterschiedlicher Ansatz, damit ein Fragment bis zu seiner Aktivität kommunizieren kann :
1) Definieren Sie eine öffentliche Schnittstelle im Fragment und erstellen Sie eine Variable dafür
2) Wandeln Sie die Aktivität in die Variable mCallback im Fragment um
3) Implementieren Sie den Listener in Ihre Aktivität
4) Überschreiben Sie die OnFragmentInteraction in der Aktivität
Weitere Informationen dazu: https://developer.android.com/training/basics/fragments/communicating.html
quelle
public void onAttach
das Fragment zu überschreiben und das Aktivitätscasting dortEin einfacher Weg, den ich gefunden habe, war der folgende: Implementieren Sie dies ist Ihr dialogFragment,
Und dann erstellen Sie in der Aktivität, die das Dialogfragment aufgerufen hat, die entsprechende Funktion als solche:
Der Toast soll zeigen, dass es funktioniert. Hat für mich gearbeitet.
quelle
Interface
als hartkoppeln mit konkreten Klassen.Ich bin sehr überrascht zu sehen, dass niemand vorgeschlagen hat, lokale Sendungen für
DialogFragment
dieActivity
Kommunikation zu verwenden! Ich finde es so viel einfacher und sauberer als andere Vorschläge. Im Wesentlichen registrieren Sie sich, damit SieActivity
die Sendungen abhören können, und Sie senden die lokalen Sendungen von IhrenDialogFragment
Instanzen. Einfach. Eine Schritt-für-Schritt-Anleitung zum Einrichten finden Sie hier .quelle
Oder teilen Sie ViewModel wie hier gezeigt:
https://developer.android.com/topic/libraries/architecture/viewmodel#sharing_data_between_fragments
quelle
In meinem Fall musste ich Argumente an ein targetFragment übergeben. Aber ich habe die Ausnahme "Fragment bereits aktiv". Also habe ich in meinem DialogFragment eine Schnittstelle deklariert, die parentFragment implementiert hat. Wenn parentFragment ein DialogFragment gestartet hat, hat es sich selbst als TargetFragment festgelegt. Dann habe ich in DialogFragment angerufen
quelle
In Kotlin
// Meine Aktivität
Ich hoffe es dient, wenn Sie verbessern können, bearbeiten Sie es bitte. Mein Englisch ist nicht sehr gut
quelle
Wenn Sie Argumente senden und das Ergebnis vom zweiten Fragment empfangen möchten, können Sie Fragment.setArguments verwenden, um diese Aufgabe auszuführen
quelle
Nur um es als eine der Optionen zu haben (da es noch niemand erwähnt hat) - Sie könnten einen Eventbus wie Otto benutzen. Im Dialog tun Sie also:
Und lassen Sie Ihren Anrufer (Aktivität oder Fragment) es abonnieren:
quelle