355 Stimmen

Falscher requestCode in onActivityResult

Ich starte eine neue Aktivität aus meinem Fragment mit

startActivityForResult(intent, 1);

und das Ergebnis in der übergeordneten Aktivität des Fragments behandeln wollen:

@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 die requestCode Ich habe soeben eine Nachricht an startActivityForResult() .

Ich bekam etwas wie 0x40001 , 0x20001 usw. mit einem zufällig gesetzten höheren Bit. In der Dokumentation steht dazu nichts. Irgendwelche Ideen?

920voto

Changwei Yao Punkte 12951

Sie rufen an startActivityForResult() von Ihrem Fragment . Wenn Sie dies tun, wird die requestCode wird durch die Activity die den Besitz der Fragment .

Wenn Sie die richtige resultCode in Ihrer Tätigkeit versuchen Sie dies:

Ändern:

startActivityForResult(intent, 1);

An:

getActivity().startActivityForResult(intent, 1);

45voto

Ashlesha Sharma Punkte 949

Der Anfragecode ist nicht falsch. Bei der Verwendung von Fragmenten der v4-Unterstützungsbibliothek wird der Fragmentindex in den oberen 16 Bits des Anforderungscodes kodiert, während Ihr Anforderungscode in den unteren 16 Bits steht. Der Fragmentindex wird später verwendet, um das richtige Fragment zu finden, das das Ergebnis liefert.

Daher für Aktivitäten gestartet Form Fragment Objekt, behandeln onActivityResult requestCode wie unten:

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)

40voto

Jaime Agudo Punkte 7649

Einfacher:

Java : int unmaskedRequestCode = requestCode & 0x0000ffff

Kotlin : val unmaskedRequestCode = requestCode and 0x0000ffff

Prüfen Sie die unteren 16 Bits, indem Sie eine logische UND-Verknüpfung mit den oberen 16 Bits durchführen und diese auf Null setzen.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final int unmaskedRequestCode = requestCode & 0x0000ffff

    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
      //Do stuff

    }
}

6voto

Nilesh Tiwari Punkte 184

Wenn Sie eine Konstante bereitstellen, machen Sie sie öffentlich und verwenden Sie sie dann in startActivityResult

Beispiel:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);

2voto

TarikW Punkte 359

Sie können auch definieren
super.onActivityResult(requestCode, resultCode, data)
in Activity (wenn Sie die Funktion onActivityResult ) hierbei

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {

        ...

        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}

und rufen startActivityForResult(intent, requestCode) in Ihrem Fragment

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X