Ich beginne eine neue Aktivität aus meinem Fragment mit
startActivityForResult(intent, 1);
und möchten das Ergebnis in der übergeordneten Aktivität des Fragments verarbeiten:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
if (requestCode == 1) {
// bla bla bla
}
}
Das Problem ist, dass ich nie das bekommen habe, auf das requestCode
ich gerade gepostet habe startActivityForResult()
.
Ich habe so etwas wie 0x40001
, 0x20001
usw. mit einem zufälligen höheren Bit gesetzt. Die Dokumente sagen nichts dazu. Irgendwelche Ideen?
android
android-fragments
onactivityresult
Dimanoid
quelle
quelle
Antworten:
Sie rufen
startActivityForResult()
von IhremFragment
. Wenn Sie dies tun,requestCode
wird das von dem geändert, demActivity
das gehörtFragment
.Wenn Sie die richtige
resultCode
Aktivität erzielen möchten, versuchen Sie Folgendes:Veränderung:
Zu:
quelle
startActivityForResult
in einem Fragment verwenden und das ErgebnisonActivityResult
in diesem Fragment erwarten , stellen Sie einfach sicher, dass Siesuper.onActivityResult
die Host-Aktivität aufrufen (falls Sie diese Methode dort überschreiben). Dies liegt daran, dass die AktivitätonActivityResult
das Fragment aufzurufen scheintonActivityResult
. Beachten Sie außerdem, dass der Anforderungscode beim Durchlaufen der AktivitätonActivityResult
geändert wird, wie in dem Link erläutert, den Dimanoid in seiner Antwort unten gepostet hat. Sie müssen das vielleicht nicht wissen, aber Sie wissen es nie ...Der Anforderungscode ist nicht falsch. Bei Verwendung von Fragmenten der v4-Unterstützungsbibliothek wird der Fragmentindex in den oberen 16 Bits des Anforderungscodes und Ihr Anforderungscode in den unteren 16 Bits codiert. Der Fragmentindex wird später verwendet, um das richtige Fragment zu finden, um das Ergebnis zu liefern.
Behandeln Sie daher für Aktivitäten, die vom Fragmentobjekt gestartet wurden, den onActivityResult-Anforderungscode wie folgt:
quelle
Einfacher:
Java :
int unmaskedRequestCode = requestCode & 0x0000ffff
Kotlin :
val unmaskedRequestCode = requestCode and 0x0000ffff
Überprüfen Sie die unteren 16 Bits, entlarven Sie sie einfach und führen Sie ein logisches UND durch, wobei die oberen 16 Bits auf Null gesetzt sind
quelle
Wenn Sie konstant bereitstellen, machen Sie es öffentlich und verwenden Sie es dann in
startActivityResult
Beispiel:
quelle
Sie können auch festlegen ,
super.onActivityResult(requestCode, resultCode, data)
in
Activity
(wenn Sie außer Kraft setzenonActivityResult
auf diese)und ruf
startActivityForResult(intent, requestCode)
in deinem anFragment
quelle
in Fragment
in der Hauptaktivität:
quelle