web-dev-qa-db-ja.com

間違ったrequestCodeが別のアクティビティからonActivityResultを返しました

別のActivityを呼び出すActivityがあり、他のActivitiesを呼び出します。結果を取得するために最後のActivityに送信し、次に結果を最初のActivityに送り返します。

流れは次のようなものです

A -> B -> C -> D -> C -> B -> A

AからDへのフローはstartActivityForResultで構成され、DからAへのフローはonActivityResult

DからBまでrequestCodeは常に同じですが(私が決めたもの)、BからAまで突然変化します私の値からランダムな値(この特定の場合は196614)へ。

これは、activity Bからactivity Aを呼び出すために使用するコードです。

filterByCatalogue.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getActivity(), CatalogueContainerActivity.class);
            startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);
        }
    });

filterByCatalogueFrameLayoutとして使用)

これは、activity Aをコールバックするために使用するコードです。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == Defines.FILTER_BY_CATALOGUE) {
            if (resultCode == RESULT_OK) {
                Intent intent = new Intent();
                intent.putExtra("article", data.getStringExtra("article"));
                setResult(RESULT_OK, intent);
                finish();
            }
        }
    }

たくさん検索しましたが、どこが間違っているのかわかりません。

22
Luca

交換するだけ

startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);

getActivity().startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);

それは確かに機能します。 :)

27
Nitesh

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

たとえば、196614は実際には3 << 16 + 6です。ここで、3はフラグメントインデックスに1を加えたもので、6はリクエストコードです。

士気:アクティビティ/フラグメントstartActivityForResult()onActivityResult()を混在させないでください。アクティビティから開始する場合は、アクティビティで結果を処理します。フラグメントから開始する場合は、結果をフラグメントで処理します。

12
laalto