解決策
val navHostFragment = parentFragment as NavHostFragment
val parent = navHostFragment.childFragmentManager.fragments[0]
if (parent is MainFragment)
// ...略
Fragment#getParentFragment()
がNavHostFragment
なのでDialogFragmentなどを実装している時、呼び出し元のFragmentにコールバックさせるのがひと手間いる。
NavHostFragment
の子Fragmentを覗いてみたら
[呼び出し元のFragment, 呼び出されたFragment, ...]
という風になっているので上記の内容で呼び出し元のFragmentを取得できた。
ただし、バックスタックがたくさんある場合はfragments[0]が呼び出し元のFragmentとは限らない。
別の解決策
val navHostFragment = parentFragment as NavHostFragment
val parent = navHostFragment.parentFragment as Fragment
if (parent is MainFragment)
// ...略
のように取得できるとのことだが、自分の環境ではnullが返ってきてしまうので1つ目の解決策をとらざるを得なかった。
NavHostFragment
にスタックを格納してるっぽいのでこれで取得できない気もするんだけど、バックスタックが多い環境下では取得できるのかもしれない。
所感
Navigationコンポーネント最高!
でも、以前の組み方が独特な方はご注意を!