web-dev-qa-db-ja.com

onActivityResultの間違ったrequestCode

私は私のフラグメントから新しいアクティビティを開始しています

startActivityForResult(intent, 1);

そして、フラグメントの親アクティビティで結果を処理したい:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode);
    if (requestCode == 1) {
        // bla bla bla
    }
}

問題は、startActivityForResult()に投稿したrequestCodeを取得できなかったことです。

ランダムな上位ビットが設定された0x400010x20001などのようなものがありました。ドキュメントはこれについて何も言わない。何か案は?

271
Dimanoid

FragmentからstartActivityForResult()を呼び出しています。これを行うと、requestCodeは、Activityを所有するFragmentによって変更されます。

アクティビティで正しいresultCodeを取得したい場合は、これを試してください:

変化する:

startActivityForResult(intent, 1);

に:

getActivity().startActivityForResult(intent, 1);
735
Changwei Yao

要求コードは間違っていません。 v4サポートライブラリフラグメントを使用する場合、フラグメントインデックスはリクエストコードの上位16ビットにエンコードされ、リクエストコードは下位16ビットにエンコードされます。フラグメントインデックスは、結果を配信するための正しいフラグメントを見つけるために後で使用されます。

したがって、フラグメントオブジェクトから開始されたアクティビティの場合、以下のようにonActivityResult requestCodeを処理します。

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

簡単:

int unmaskedRequestCode = requestCode & 0x0000ffff

下位16ビットを確認し、上位16ビットをゼロにした論理ANDを実行してマスクを解除します

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

    final int unmaskedRequestCode = requestCode & 0x0000ffff

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

    }
}
16
Jaime Agudo

定数を提供する場合は、それをパブリックにしてからstartActivityResultで使用します

例:

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

定義することもできます
super.onActivityResult(requestCode, resultCode, data)
in Activity(overrideonActivityResultの場合)at this

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

        ...

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

そしてFragment内でstartActivityForResult(intent, requestCode)を呼び出します

2
TarikW

フラグメントで

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

主なアクティビティ:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }