むあーるの雑記

Back

[Android]Fragmentの実装の仕方について

Fragment正しく実装できてますか? 結構みんな間違ってFragment実装しているコードを見るので、 一度Fragmentの実装について自分なりに整理してみました。

FragmentでDatabindingを使う場合の実装について#

DatabindingをFragmentのフィールドに持つ場合は必ずonDestroyViewで開放する必要があります。 https://developer.android.com/topic/libraries/view-binding#fragments

でそのためにはbindingフィールドをNullableにしないといけないんですが、 Nullableにするといちいちオプショナルの解除が必要でNonNullで宣言したいんですよね。

そこで、こういう風にAutoCleardValueを使ったり https://github.com/DroidKaigi/conference-app-2020/pull/294/files#diff-ece280c4922c43e26a5266b1a334647bR32

DataBinding-ktxを使ったり https://github.com/wada811/DataBinding-ktx

といろいろあるわけなんですが。

調べてみてAutoCleardValueはonDestroyView以降でbindingを触るとクラッシュする可能性があるし。

DataBinding-ktxは結局使い勝手があまりNullableで宣言するのと変わらない感じがあって。 わざわざライブラリに依存してまで対応するほどなのか?という気がするし。

で、結局は普通にNullableで宣言すればいいんでは?と思ってしまいました。 ただ、絶対にonDestroyViewで開放忘れを無くしたいぜって場合はDataBinding-ktxがいいとは思います。

Fragmentでのviewのinfrateについて#

FragmentのviewをinfrateするのにonCreateViewをoverrideしますが。 実はAndroidXのFragmentは下記のようにコンストラクタに直接LayoutXMLを渡せて、onCreateViewをoverrideする必要がない書き方ができます。

https://developer.android.com/reference/androidx/fragment/app/Fragment#Fragment(int


class MainFragment : Fragment(R.layout.main_fragment){

}
kotlin

この書き方だとonCreateViewでinfrate以外のViewの初期化をしたりといった非推奨な書き方をしないように、onCreateViewをそもそも書かないので強制できるわけです。 https://developer.android.com/reference/androidx/fragment/app/Fragment#onCreateView(android.view.LayoutInflater,android.view.ViewGroup,android.os.Bundle

ただこれだとDatabindingのインスタンスはどうやって取得するのか?となるんですが。

onViewCreatedで下記のようにviewRootからDatabindingのインスタンスが取得できるようになっています。

https://developer.android.com/topic/libraries/data-binding/generated-binding#create


val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
kotlin

まとめ#

いろいろ調べて書いてきましたが結論として できるだけシンプルに間違った書き方ができない、しずらいコードを目指すと このサンプルの実装が今の所シンプルで良かったですということです。 さすが公式サンプルでした。

https://github.com/android/architecture-components-samples/blob/master/ViewBindingSample/app/src/main/java/com/android/example/viewbindingsample/BindFragment.kt#L36-L41

[Android]Fragmentの実装の仕方について
https://note.muaaru.com/blog/2021-12-25-post-574
Author muaaru
Published at 2021年12月25日