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
滅茶苦茶泥臭い回避策が載っているけど、基本的にはこういう方向でしか回避できないだろうなぁ