閉じる

onActivityResultと getChildFragmentManager

getChildFragmentManagerを通じて追加した Fragmentから startActivityForResultを呼び出しても Activityの onActivityResultが呼び出されるだけで、Fragmentの onActivityResultが呼び出されない。
これは Fragmentの onActivityResult呼び出しは requestCodeの下位 16bitに本来の requestCode、上位 16bitに Fragmentのインデックスを格納することによって Activityの Fragmentリストから Fragmentを特定することで実現されている事に由来する。
この実装はフラグメントのリストが一つしかないから可能なことで、getChildFragmentManagerを使って構築されたネストしたフラグメントには対応できない。
とりあえず今回のケースは Activityの孫 Fragment*1 の問題なので、子 Fragment.startActivityForResultを呼び出すようにし、子 Fragmentの onActivityResultで requestCodeを元に*2 Fragmentを特定して対処することにした。
そもそも偶然 Fragmentインデックスが一致してしまうことで意図しない Fragmentの onActivityResultが呼ばれてしまう気がするけどどうなっているのだろう?
FYI: Issue 40537 – android – Nested fragment not receiving response in onActivityResult() – Android Open Source Project – Issue Tracker – Google Project Hosting
滅茶苦茶泥臭い回避策が載っているけど、基本的にはこういう方向でしか回避できないだろうなぁ


*1 静的な親子関係

*2 1:1に対応するケースにしか使えないけどね。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)