私は私のフラグメントから新しいアクティビティを開始しています
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
を取得できなかったことです。
ランダムな上位ビットが設定された0x40001
、0x20001
などのようなものがありました。ドキュメントはこれについて何も言わない。何か案は?
Fragment
からstartActivityForResult()
を呼び出しています。これを行うと、requestCode
は、Activity
を所有するFragment
によって変更されます。
アクティビティで正しいresultCode
を取得したい場合は、これを試してください:
変化する:
startActivityForResult(intent, 1);
に:
getActivity().startActivityForResult(intent, 1);
要求コードは間違っていません。 v4サポートライブラリフラグメントを使用する場合、フラグメントインデックスはリクエストコードの上位16ビットにエンコードされ、リクエストコードは下位16ビットにエンコードされます。フラグメントインデックスは、結果を配信するための正しいフラグメントを見つけるために後で使用されます。
したがって、フラグメントオブジェクトから開始されたアクティビティの場合、以下のようにonActivityResult requestCodeを処理します。
originalRequestCode = changedRequestCode - (indexOfFragment << 16)
6 = 196614 - (3 << 16)
簡単:
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
}
}
定数を提供する場合は、それをパブリックにしてからstartActivityResult
で使用します
例:
public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
定義することもできます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)
を呼び出します
フラグメントで
getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);
主なアクティビティ:
if (requestCode == PLACE_PICKER_REQUEST) {
if (resultCode == RESULT_OK) {
//what ever you want to do
}