調べたこと
FragmentをActivityにaddする処理の書き方について
背景
コードレビューにてこんなコードを見つけました。
.java
savedInstanceState ?: run {
val fragment = HogeFragment.newInstance()
supportFragmentManager
.beginTransaction()
.add(R.id.container, fragment)
.commit()
}
savedInstanceState
を確認して、
Activityの再生成時にFragmentが重複しないようにしてくれてるね。
いいじゃん、いいじゃん。
あれ...?
だけど、なんか懐かしさを感じる。
最近これを自分で書いた記憶ないぞ..!?
自分の最近のプロジェクトを覗いてみる
.java
supportFragmentManager.findFragmentById(R.id.container) ?: run {
val fragment = HogeFragment.newInstance()
supportFragmentManager
.beginTransaction()
.add(R.id.container, fragment)
.commit()
}
思い出しました。
指定したViewのIDにFragmentが登録されているかを確認して、
Fragmentが登録されていなければaddする、としていました。
どっちがいいの??
それぞれ、僕の理解で日本語に落とし込みます。
- Activityが初回生成時には、Fragmentをaddする
- ViewにFragmentが登録されていなければ、Fragmentをaddする
どうでしょう?
個人的には、後者の方が考えやすいです。
当然、画面回転などのActivity再生成はどちらでもハンドリングできます。
なので、最近僕は savedInstanceState ?: run {}
を書いていなかったんです。
最後に
ちなみに、背景で書いたコードレビューではコメントを付けずにスルーしました。
なぜなら、これは好みの範疇だと思ったからです。
ただ、世間ではjetpackのnavigationを使う流れがきています。
自分でFragmentをaddするなんて時代遅れなのかもしれません。