onActivityResultの間違ったrequestCode


310

私は私のフラグメントから新しい活動を始めています

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
    }
}

問題は、requestCode投稿したばかりのメールが届かなかったことstartActivityForResult()です。

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


回答:


837

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

resultCodeあなたの活動で正しいものを取得したい場合は、これを試してください:

変化する:

startActivityForResult(intent, 1);

に:

getActivity().startActivityForResult(intent, 1);

44
これは、結果をに送信するフラグメントを決定する必要があるためです。したがって、フラグメントがStartActivityForResultを呼び出すとき。requestCodeはアクティビティによって変更されるため、結果をどのフラグメントに配信するかがわかります。Activiyで結果を本当に取得したい場合。getActivity()。startActivityForResult()を呼び出すだけです。
Changwei Yao

31
注:startActivityForResultフラグメントで使用し、onActivityResultそのフラグメントからの結果を期待する場合は、必ずsuper.onActivityResultホストアクティビティを呼び出してください(そのメソッドをそこでオーバーライドする場合)。これは、アクティビティonActivityResultがフラグメントを呼び出すように見えるためonActivityResultです。また、リクエストコードがアクティビティのを通過するときにonActivityResult、Dimanoidが以下の回答に投稿したリンクで説明されているように変更されることに注意してください。...あなたはそれを知っている必要はないかもしれませんが、あなたは知っていることはありません
フェランMaylinch

31
「requestCodeはフラグメントを所有するアクティビティによって変更されます」-Androidのデザインが気に入った...
ティアゴ

13
ドキュメントでは明確な場所を見つけることができないような重要な情報。お奨めは、あなたの人生を地獄にするために設計されたアンドロイドのデザインが大好きです。
Driss Bounouar 2016年

2
私はあなたを愛しています、私はこの問題を理解し、エラーを修正するために何日も費やしました、ありがとう!
tinyCoder 2017年

35

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

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

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

1
この問題の正確な原因を説明する
優れた

簡単な質問:indexOfFragmentとは何ですか?
Louis Tsai

indexOfFragmentは、getSupportFragmentManager()。getFragments()が生成するインデックスです
HerberthObregon

25

より簡単に:

Javaint unmaskedRequestCode = requestCode & 0x0000ffff

コトリンval unmaskedRequestCode = requestCode and 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

    }
}

1
元のリクエストコードが表示されない理由を教えてください。
K.Sopheak 2017

3
フラグメントを所有するアクティビティによってrequestCodeが変更される原因です。Ashlesha Sharmaの回答を参照してください
Jaime Agudo

ありがとう、これが私が探していた答えです。Androidが元のリクエストコードを返すべきではない理由はわかりません。
tonisives

これは今日私にとって非常に役に立ち、実際に問題を非常にうまく説明しています。ありがとう!
ビリー・ラザロ

6

定数を提供している場合はそれを公開してから使用します startActivityResult

例:

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

2

これ
super.onActivityResult(requestCode, resultCode, data)
Activity(をオーバーライドする場合onActivityResult)で定義することもできます

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

        ...

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

startActivityForResult(intent, requestCode)あなたの中に電話Fragment


0

フラグメントで

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

メインアクティビティ:

if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {    
     //what ever you want to do
            }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.