Falscher requestCode in onActivityResult


310

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 requestCodeich gerade gepostet habe startActivityForResult().

Ich habe so etwas wie 0x40001, 0x20001usw. mit einem zufälligen höheren Bit gesetzt. Die Dokumente sagen nichts dazu. Irgendwelche Ideen?


Mögliches Duplikat von onActivityResult wird in Fragment
PhoneixS

Antworten:


837

Sie rufen startActivityForResult()von Ihrem Fragment. Wenn Sie dies tun, requestCodewird das von dem geändert, dem Activitydas gehört Fragment.

Wenn Sie die richtige resultCodeAktivität erzielen möchten, versuchen Sie Folgendes:

Veränderung:

startActivityForResult(intent, 1);

Zu:

getActivity().startActivityForResult(intent, 1);

44
Weil es entscheiden sollte, an welches Fragment das Ergebnis geliefert wird. Also, wenn The Fragment StartActivityForResult aufruft. Der requestCode wird von der Aktivität geändert, sodass er weiß, wie das Ergebnis an welches Fragment übergeben wird. wenn Sie wirklich das Ergebnis in der Aktivität erhalten möchten. Rufen Sie einfach getActivity (). startActivityForResult () auf.
Changwei Yao

31
Nur ein Hinweis: Wenn Sie startActivityForResultin einem Fragment verwenden und das Ergebnis onActivityResultin diesem Fragment erwarten , stellen Sie einfach sicher, dass Sie super.onActivityResultdie Host-Aktivität aufrufen (falls Sie diese Methode dort überschreiben). Dies liegt daran, dass die Aktivität onActivityResultdas Fragment aufzurufen scheint onActivityResult. Beachten Sie außerdem, dass der Anforderungscode beim Durchlaufen der Aktivität onActivityResultgeä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 ...
Ferran Maylinch

31
"Der requestCode wird durch die Aktivität geändert, der das Fragment gehört" - Ich muss das Android-Design lieben ...
Tiago

13
Eine so wichtige Information, dass Sie in den Dokumenten nirgendwo klar finden können. Ich muss das Android-Design lieben, das dein Leben zur Hölle machen soll.
Driss Bounouar

2
Mann, ich liebe dich, ich habe viele Tage damit verbracht, dieses Problem zu verstehen und den Fehler zu beheben, danke!
tinyCoder

35

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:

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

1
Tolle Informationen, die die genaue Ursache für dieses Problem
erklären

kurze Frage: Was ist indexOfFragment?
Louis Tsai

indexOfFragment ist der Index, den getSupportFragmentManager (). getFragments () erzeugt
HerberthObregon

25

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

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

    final int unmaskedRequestCode = requestCode & 0x0000ffff

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

    }
}

1
Können Sie mir den Grund nennen, warum der ursprüngliche Anforderungscode nicht angegeben wird?
K.Sopheak

3
Ursache Der requestCode wird von der Aktivität geändert, der das Fragment gehört. Siehe Ashlesha Sharma Antwort
Jaime Agudo

Danke, das ist die Antwort, nach der ich gesucht habe. Ich verstehe nicht, warum Android den ursprünglichen Anforderungscode nicht zurückgeben sollte.
Tonisives

Das war für mich heute sehr hilfreich und erklärt das Problem wirklich sehr gut. Vielen Dank!
Billy Lazzaro

6

Wenn Sie konstant bereitstellen, machen Sie es öffentlich und verwenden Sie es dann in startActivityResult

Beispiel:

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

2

Sie können auch festlegen ,
super.onActivityResult(requestCode, resultCode, data)
in Activity(wenn Sie außer Kraft setzen onActivityResultauf diese)

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

        ...

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

und ruf startActivityForResult(intent, requestCode)in deinem anFragment


0

in Fragment

  getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);

in der Hauptaktivität:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.