タイトル通りに苦しんだのでせっかくだし、メモ的に残します。
やりたかったこと
FragmentでstartActivityForResultして、
別のActivityを開いて用が済んだらResultをsetしてfinishし、
startActivity〜したFragmentの親であるActivityでResultを受け取ってなんか処理する
うまくいかない
Activity(*)⇔Activityだと
Activity(*)のonActivityResultは
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
//処理
}
}
みたいな感じで事足りますが、FragmentからstartActivity〜しただけでなんかうまくいかない...
こうしたらできた
Fragment(*)→Activity→Activity(*の親)だと
Activity(*の親)のonActivityResultは
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && (requestCode & 0xffff) == REQUEST_CODE) {
//処理
}
}
としなくてはいけない。
なんで?
大切なのはif文の中の(requestCode & 0xffff) == REQUEST_CODE)
requestCode、intなので32bitあるはずなんですが、16bitの制限があります。
上位16bitはrequestCodeがどのFragmentから来たのか...などを管理するbitになります。
今回、FragmentからstartActivity〜するのでまさにそういう情報が管理されている状態。
なので、上位16bitにFragment情報が乗った状態でActivityのonActivityResultに帰ってきます。
だから、requestCode & 0xffff
で上位16bitを落として、もともとの下位16bitを取り出します。