どうも。どっことです。今回はdeprecatedとなっているFragment#setTargetFragment
の移行対応について解説します。
setTargetFragmentの移行対応について
複数のFragment
を使って画面遷移を実装するとき、遷移先の画面で決めたことを遷移元の画面に教えてあげたいときがあります。たとえば
- 設定画面で設定の要素をタップしたらそれに関する設定値の一覧が表示される。
- ユーザは一覧から設定項目を選択する。
- 選択した値を設定画面に返してあげて、設定画面にはユーザが選択したものを最新の設定値として表示する。
などですね。
これまではFragment
間のデータのやりとりはtargetFragment
を使うことで実現できました。呼び出し元のFragment
を遷移先から参照できるようにして、その参照から呼び出しもとにデータを返してあげる。という具合です。
さて、「これまでは」と書いた通り、このメソッドdeprecated(非推奨)になってしまいました。これの扱いが簡単だったので個人的に非常にありがたかったのですが、Google様のお達しなので、今後は推奨されるやり方で実装する必要があります。今回は備忘録も含め、新しい実装方法を載せたいと思います。
解説
以下の順に解説していきます。
- 呼び出される側の実装
- 呼び出す側の実装
Activity
→Fragment
の場合Fragment
→Fragment
の場合
呼び出される側の実装
parentFragmentManager.setFragmentResult("request_key", Bundle())
呼び出される側の実装はシンプルで、(自身を管理している)parentFragmentManager
に渡したいデータを設定します。
通知したい情報をBundle
に詰める必要があるため、上記の例は必要最低限のスニペットです。
呼び出す側の実装
Activity -> Fragment の場合
supportFragmentManager.setFragmentResultListener("request_key", this) { _, result ->
// result を参照して結果を処理する
}
呼び出すFragment
はActivity
が持っているsupportFragmentManager
が管理しているので、それに対してResultListener
をセットしてあげます。Activity
がDialogFragment
を表示するときは上記の実装になります。
Fragment -> Fragment の場合
childFragmentManager.setFragmentResultListener("request_key", this) { _, result ->
// result を参照して結果を処理する
}
一方で Fragment
-> Fragment
の場合はちょっとだけ注意が必要です。呼び出すFragment
を呼び出し元のFragment
が持つFragmentManager
管理している場合、こちらの実装パターンが利用できます。例えばFragment
が、自身が持っているchildFragmentManager
を使ってDialogFragment
を表示するなどの場合は、こちらの実装が使えます。
ただし、表示するDialogFragent
をActivity
が持っているsupportFragmentManager
が表示する場合、このパターンではなく
Activity
->
Fragment
のパターンで実装することになります。表示するDialogFragment
をどのFragmentManager
が管理するかが違うためです。
まとめ
今回はdeprecatedとなっているFragment#setTargetFragment
の移行について解説しました。開発期間が長いアプリケーションでは、まだまだsetTargetFragment
でFragment
間での結果のやり取りを処理しているものも多いのではないでしょうか。deprecatedとなっているメソッドのため、なるべく早めに解消しておきたいですね。