別の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);
}
});
(filterByCatalogue
をFrameLayout
として使用)
これは、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();
}
}
}
たくさん検索しましたが、どこが間違っているのかわかりません。
交換するだけ
startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);
と
getActivity().startActivityForResult(intent, Defines.FILTER_BY_CATALOGUE);
それは確かに機能します。 :)
リクエストコードはランダムではありません。 v4サポートライブラリフラグメントを使用する場合、フラグメントインデックスはリクエストコードの上位16ビットにエンコードされ、リクエストコードは下位16ビットにエンコードされます。フラグメントインデックスは、後で結果を配信する正しいフラグメントを見つけるために使用されます。 参照 。
たとえば、196614は実際には3 << 16 + 6です。ここで、3はフラグメントインデックスに1を加えたもので、6はリクエストコードです。
士気:アクティビティ/フラグメントstartActivityForResult()
とonActivityResult()
を混在させないでください。アクティビティから開始する場合は、アクティビティで結果を処理します。フラグメントから開始する場合は、結果をフラグメントで処理します。