In meiner Aktivität rufe ich eine zweite Aktivität aus der Hauptaktivität von auf startActivityForResult
. In meiner zweiten Aktivität gibt es einige Methoden, die diese Aktivität beenden (möglicherweise ohne Ergebnis). Nur eine davon gibt jedoch ein Ergebnis zurück.
Zum Beispiel rufe ich von der Hauptaktivität eine zweite an. In dieser Aktivität überprüfe ich einige Funktionen des Mobilteils, z. B. eine Kamera. Wenn dies nicht der Fall ist, werde ich diese Aktivität schließen. Während der Vorbereitung MediaRecorder
oder MediaPlayer
wenn ein Problem auftritt, werde ich diese Aktivität schließen.
Wenn das Gerät über eine Kamera verfügt und die Aufnahme vollständig abgeschlossen ist, sende ich nach der Aufnahme eines Videos, wenn ein Benutzer auf die Schaltfläche "Fertig" klickt, das Ergebnis (Adresse des aufgenommenen Videos) an die Hauptaktivität zurück.
Wie überprüfe ich das Ergebnis der Hauptaktivität?
Antworten:
Aus Ihrem
FirstActivity
Aufruf dieSecondActivity
using-startActivityForResult()
MethodeZum Beispiel:
In Ihrem
SecondActivity
Set die Daten, zu denen Sie zurückkehren möchtenFirstActivity
. Wenn Sie nicht zurückkehren möchten, stellen Sie keine ein.Zum Beispiel: In,
SecondActivity
wenn Sie Daten zurücksenden möchten:Wenn Sie keine Daten zurückgeben möchten:
FirstActivity
Schreiben Sie nun in Ihrer Klasse den folgenden Code für dieonActivityResult()
Methode.Um die Weitergabe von Daten zwischen zwei Aktivitäten in Kotlin viel besser zu implementieren, klicken Sie bitte auf diesen Link " Eine bessere Möglichkeit, Daten zwischen Aktivitäten weiterzugeben ".
quelle
SecondActivity
einigen Fällen ist eine Ausnahme aufgetreten. In diesem Fall müssen Sie auch das Ergebnis an das zurückgebenFirstActivity
, damit Sie das Ergebnis wie"RESULT_CANCELLED"
im catch-Block festlegen und zuFirstActivty
und in zurückkehrenFirstActivity's' 'onActivityResult()
können, um zu überprüfen, ob Sie das Erfolgs- oder Fehlerergebnis erhalten haben.Sie müssen
Activity.onActivityResult()
die Parameter überschreiben und dann überprüfen:requestCode
Gibt an, welche App diese Ergebnisse zurückgegeben hat. Dies wird von Ihnen beim Anruf festgelegtstartActivityForResult()
.resultCode
Informiert Sie, ob diese App erfolgreich war, fehlgeschlagen ist oder etwas anderesdata
enthält alle von dieser App zurückgegebenen Informationen. Das kann seinnull
.quelle
Ergänzend zur Antwort von @ Nishant können Sie das Aktivitätsergebnis am besten zurückgeben:
Ich hatte ein Problem mit
Dann fand ich heraus, dass der richtige Weg verwendet wird
um die aktuelle Absicht zu bekommen
quelle
Intent
, die nur für a existiertBundle
und nicht die normalen Werte wie eine Aktion oder Komponente aufweist. Es fühlt sich aber auch etwas seltsam (und möglicherweise gefährlich?) An, das zu ändernIntent
, mit dem die aktuelle Aktivität gestartet wurde. Also habe ich die Quelle nach Android selbst durchsucht und festgestellt, dass sie immer eine neue erstellenIntent
, um sie als Ergebnis zu verwenden. Zum Beispiel github.com/aosp-mirror/platform_frameworks_base/blob/…getIntent()
scheint eine perfekte Möglichkeit zu sein, Daten an unbekannte Aktivitäten zurückzugeben, von denen aus die Aktivität aufgerufen wurde. Vielen Dank!Beispiel
Um den gesamten Prozess im Kontext zu sehen, finden Sie hier eine ergänzende Antwort. Weitere Erklärungen finden Sie in meiner ausführlicheren Antwort .
MainActivity.java
SecondActivity.java
quelle
Für diejenigen, die Probleme mit dem falschen requestCode in onActivityResult haben
Wenn Sie
startActivityForResult()
von Ihrem aus anrufenFragment
, wird der requestCode von der Aktivität geändert, der das Fragment gehört.Wenn Sie den richtigen resultCode in Ihrer Aktivität erhalten möchten, versuchen Sie Folgendes:
Veränderung:
startActivityForResult(intent, 1);
Zu:getActivity().startActivityForResult(intent, 1);
quelle
Wenn Sie die Benutzeroberfläche mit dem Aktivitätsergebnis aktualisieren möchten, können Sie sie nicht verwenden. Dadurch wird
this.runOnUiThread(new Runnable() {}
die Benutzeroberfläche nicht mit einem neuen Wert aktualisiert . Stattdessen können Sie Folgendes tun:Das scheint albern, funktioniert aber ziemlich gut.
quelle
Zuerst verwenden Sie
startActivityForResult()
mit Parametern in firstActivity
und wenn Sie Daten von secondActivity
nach first senden möchten,Activity
übergeben Sie den Wert mitIntent
withsetResult()
method und erhalten diese Daten innerhalb vononActivityResult()
method in firstActivity
.quelle
Sehr häufiges Problem bei Android
Es kann in 3 Teile unterteilt werden
1) Starten Sie Aktivität B (passiert in Aktivität A)
2) Setzen Sie die angeforderten Daten (passiert in Aktivität B)
3) Empfangen Sie angeforderte Daten (passiert in Aktivität A)
In diesem Teil entscheiden Sie, ob Sie Daten zurücksenden möchten oder nicht, wenn ein bestimmtes Ereignis eintritt.
Beispiel: In Aktivität B gibt es einen EditText und zwei Schaltflächen b1, b2.
Durch Klicken auf die Schaltfläche b1 werden Daten an Aktivität A zurückgesendet. Durch
Klicken auf die Schaltfläche b2 werden keine Daten gesendet.
Daten senden
Keine Daten senden
Benutzer klickt auf die Schaltfläche Zurück
Standardmäßig wird das Ergebnis mit dem Antwortcode Activity.RESULT_CANCEL festgelegt
Überschreiben Sie dazu die onActivityResult-Methode
quelle
Die ActivityResultRegistry ist der empfohlene Ansatz
ComponentActivity
bietet jetzt eine FunktionActivityResultRegistry
, mit der Sie sowohl diestartActivityForResult()
+onActivityResult()
als auch dierequestPermissions()
+onRequestPermissionsResult()
Flows verarbeiten können, ohne die Methoden in IhremActivity
oder zu überschreibenFragment
, erhöht die Typensicherheit überActivityResultContract
und bietet Hooks zum Testen dieser Flows.Es wird dringend empfohlen, die in AndroidX Activity 1.2.0-alpha02 und Fragment 1.3.0-alpha02 eingeführten APIs für Aktivitätsergebnisse zu verwenden.
Fügen Sie dies Ihrem hinzu
build.gradle
Wie verwende ich den vorgefertigten Vertrag?
Diese neue API verfügt über die folgenden vorgefertigten Funktionen
Ein Beispiel, das den takePicture-Vertrag verwendet:
Also, was ist hier los? Lassen Sie es uns etwas aufschlüsseln.
takePicture
ist nur ein Rückruf, der eine nullfähige Bitmap zurückgibt - ob sie null ist oder nicht, hängt davon ab, ob deronActivityResult
Prozess erfolgreich war oder nicht .prepareCall
registriert dann diesen Anruf in einer neuen FunktionComponentActivity
namens theActivityResultRegistry
- wir werden später darauf zurückkommen.ActivityResultContracts.TakePicture()
ist einer der integrierten Helfer, die Google für uns erstellt hat, und das endgültige AufrufentakePicture
löst die Absicht auf dieselbe Weise aus, wie Sie es zuvor getan habenActivity.startActivityForResult(intent, REQUEST_CODE)
.Wie schreibe ich einen benutzerdefinierten Vertrag?
Einfacher Vertrag, der ein Int als Eingabe verwendet und einen String zurückgibt, der die angeforderte Aktivität im Ergebnis Intent zurückgibt.
Weitere Informationen finden Sie in dieser offiziellen Dokumentation.
quelle
quelle