Ich habe zwei Aktivitäten: Hauptaktivität und Kinderaktivität.
Wenn ich in der Hauptaktivität eine Taste drücke, wird die untergeordnete Aktivität gestartet.
Jetzt möchte ich einige Daten an den Hauptbildschirm zurücksenden. Ich habe die Bundle-Klasse verwendet, aber sie funktioniert nicht. Es werden einige Laufzeitausnahmen ausgelöst.
Gibt es dafür eine Lösung?
android
android-intent
Rajapandian
quelle
quelle
Antworten:
Abhängig von den Umständen gibt es verschiedene Möglichkeiten, um das zu erreichen, was Sie wollen.
Das häufigste Szenario (wie es sich bei Ihnen anhört) ist, wenn eine untergeordnete Aktivität verwendet wird, um Benutzereingaben abzurufen - z. B. die Auswahl eines Kontakts aus einer Liste oder die Eingabe von Daten in ein Dialogfeld. In diesem Fall sollten
startActivityForResult
Sie die Aktivität Ihres Kindes starten.Dies bietet eine Pipeline zum Zurücksenden von Daten an die Hauptaktivität mithilfe von
setResult
. Die setResult-Methode verwendet einen int-Ergebniswert und eine Absicht, die an die aufrufende Aktivität zurückgegeben wird.Um auf die zurückgegebenen Daten in der aufrufenden Aktivität zuzugreifen, überschreiben Sie diese
onActivityResult
. Der requestCode entspricht der imstartActivityForResult
Aufruf übergebenen Ganzzahl , während der resultCode und die Datenabsicht von der untergeordneten Aktivität zurückgegeben werden.quelle
startActivityForResult
Funktion anstelle von nur verwendenstartActivity
. Ein Beispiel könnte sein,startActivityForResult(myIntent, 2);
dass 2 der Ergebniscode ist, der den PlatzMY_CHILD_ACTIVITY
in der obigen switch-Anweisung einnehmen kann .Aktivität 1 verwendet startActivityForResult :
Aktivität 2 wird gestartet und Sie können den Vorgang ausführen, um die Aktivität zu schließen. Gehen Sie folgendermaßen vor:
Aktivität 1 - Wenn Sie von der vorherigen Aktivität zurückkehren, wird onActivityResult aufgerufen :
UPDATE: Antwort auf den Kommentar von Seenu69, In Aktivität zwei,
Dann in Aktivität eins,
quelle
Daten zurücksenden
Es hilft mir, die Dinge im Kontext zu sehen. Hier ist ein komplettes einfaches Projekt zum Zurücksenden von Daten. Anstatt die XML-Layoutdateien bereitzustellen, ist hier ein Bild.
Hauptaktivität
startActivityForResult
und geben Sie einen beliebigen Ergebniscode ein.onActivityResult
. Dies wird aufgerufen, wenn die zweite Aktivität beendet ist. Sie können sicherstellen, dass es sich tatsächlich um die zweite Aktivität handelt, indem Sie den Anforderungscode überprüfen. (Dies ist nützlich, wenn Sie mehrere verschiedene Aktivitäten von derselben Hauptaktivität aus starten.)Intent
. Die Daten werden mit einem Schlüssel-Wert-Paar extrahiert.MainActivity.java
Zweite Aktivität
Intent
. Die Daten werden unterIntent
Verwendung eines Schlüssel-Wert-Paares im gespeichert .RESULT_OK
und fügen Sie die Absicht hinzu, die Ihre Daten enthält.finish()
an, um die zweite Aktivität zu schließen.SecondActivity.java
Weitere Hinweise
RESULT_OK
. Verwenden Sie einfach den vollständigen Namen :Activity.RESULT_OK
.Siehe auch
quelle
FirstActivity verwendet startActivityForResult:
Rufen Sie bei SecondActivity setResult () onClick-Ereignisse oder onBackPressed () auf.
quelle
Rufen Sie die untergeordnete Aktivität Intent mit dem Methodenaufruf startActivityForResult () auf
Ein Beispiel hierfür finden Sie hier: http://developer.android.com/training/notepad/notepad-ex2.html
und im Abschnitt "Zurückgeben eines Ergebnisses von einem Bildschirm": http://developer.android.com/guide/faq/commontasks.html#opennewscreen
quelle
Ich habe eine einfache Demo-Klasse für Ihre bessere Referenz erstellt.
quelle
In der ersten Aktivität können Sie die Absicht mit senden
startActivityForResult()
und dann das Ergebnis der zweiten Aktivität abrufen, nachdem die Verwendung beendet wurdesetResult
.MainActivity.class
SecondActivity.class
quelle
Alle diese Antworten erklären, dass das Szenario Ihrer zweiten Aktivität nach dem Senden der Daten abgeschlossen sein muss.
Wenn Sie jedoch die zweite Aktivität nicht beenden und die Daten zuerst an senden möchten, können Sie BroadCastReceiver verwenden.
In der zweiten Aktivität -
In der ersten Aktivität-
Registrieren Sie den Empfänger in onCreate () -
Heben Sie die Registrierung in onDestroy () auf
quelle
Eine andere Möglichkeit, das gewünschte Ergebnis zu erzielen, das je nach Situation möglicherweise besser ist, besteht darin, eine Listener-Oberfläche zu erstellen.
Indem die übergeordnete Aktivität eine Schnittstelle abhört, die von der untergeordneten Aktivität ausgelöst wird, während die erforderlichen Daten als Parameter übergeben werden, kann dies zu ähnlichen Umständen führen
quelle
Es gibt einige Möglichkeiten, dies zu tun. 1. Verwenden Sie das startActivityForResult (), das in den obigen Antworten sehr gut erklärt wird.
indem Sie die statischen Variablen in Ihrer "Utils" -Klasse oder einer anderen eigenen Klasse erstellen. Zum Beispiel möchte ich studentId von ActivityB an ActivityA übergeben. Zuerst ruft meine ActivityA die ActivityB auf. Legen Sie dann in ActivityB die studentId fest (ein statisches Feld in Utils.class). Gefällt mir Utils.STUDENT_ID = "1234"; Verwenden Sie dann beim Zurückkehren zur AktivitätA die studentId, die in Utils.STUDENT_ID gespeichert ist.
indem Sie eine Getter- und Setter-Methode in Ihrer Anwendungsklasse erstellen.
so was:
Also bist du fertig. Legen Sie einfach die Daten fest, wenn Sie sich in Aktivität B befinden, und rufen Sie die Daten ab, nachdem Sie zu Aktivität A zurückgekehrt sind.
quelle
Nur ein kleines Detail, von dem ich denke, dass es in den obigen Antworten fehlt.
Wenn Ihre untergeordnete Aktivität über mehrere übergeordnete Aktivitäten geöffnet werden kann, können Sie überprüfen, ob Sie dies tun müssen
setResult
oder nicht, basierend darauf, ob Ihre Aktivität vonstartActivity
oder geöffnet wurdestartActivityForResult
. Sie können dies erreichen, indem Sie verwendengetCallingActivity()
. Mehr Infos hier .quelle
Verwenden Sie sharedPreferences, speichern Sie Ihre Daten und greifen Sie von überall in der Anwendung darauf zu
Speichern Sie das Datum so
Und solche Daten erhalten
quelle