LoginSignup
9
4

More than 5 years have passed since last update.

FragmentからstartActivityForResultしてActivityでResult受け取るのに苦しんだメモ。

Last updated at Posted at 2018-10-29

タイトル通りに苦しんだのでせっかくだし、メモ的に残します。

やりたかったこと

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を取り出します。

9
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4