はじめに
Androidエンジニアとして働き始めてはや4週間。
目の前の仕事とインプットをする日々であっという間に過ぎています。
そんな中今回はレイアウト関連で、当たり前だけど、今更なんだっけと聞けない人や僕のようなペーペーAndroiderが調べるであろうところを自分のアウトプットのためにも残しておこうと思います。
そもそも、自分の今入っているプロジェクトがかなり昔から続いているアプリでいろんな時代の技術が残っていたりするので、とりあえずJetpackCompposeだけを理解すれば良いみたいな感じではなく、このような記事を書くに至っています。
iOSエンジニア時代は、storyboardとなんか似てるけど色々書いたり、レイアウトがいまいち見た目でピンとこないなーとかって思っていました。(storyboardはピーってViewクラスの宣言先にGUIでくっつければよかったし、UIのパーツも割と配置や間隔や見た目なども個人的には分かりやすかった)
UI実装の変遷
まずは、UI実装はXMLレイアウトとJetpackComposeといった実装がある中でXMLレイアウトを利用した際のViewのコード、いわゆるActivityやFragmentとのbindingについて書いていきます。
調べた感じ登場の順序として、
最初期はfindViewById
findViewById<HButton>(R.id.button)
次はアノテーション@BindView
@BindView(R.id.button)
lateinit var button: Button
その次はDataBinding
// 双方向バインディング
android:text="@={viewModel.text}"
その次はViewBinding
// 単一方向のビュー参照
binding.button.text = "Click me"
そしてJetpack Compose
@Composable
fun Xxx(){
}
といった流れになっています。
findViewByIdはNullチェックが必要であったり型を明示的にしないといけなかったりと不安定なものですが、
その次はViewBindingによってNull安全、型安全なものになりました。(見た目もシンプル)
DataBindingとViewBindingと名前が似ていますが、どのような違いがあるか調べました。
上記の例でも少し触れていますが、単一な参照なのか双方向に参照し合うのかの違いが大きいです。
MVVMのデザインパターンを利用している場合やデータの状態をリアルタイムに画面の変更を反映したい場合はDataBindingが向いています。
単純に画面へデータの反映を行い、ユーザーのインタラクトに対して特定の処理を実行するものであればViewBindingが向いています。
※向いていますという表現があっているか疑問ではありますが、どちらもそのようなシーンに向いているというだけであってそれぞれでも実現できはします。
inflateって何?
最初思いました、「inflateって何?」
これはXMLファイルをViewのコードから操作できるようにするお決まりの処理です。
// activity_main.xmlというXMLファイルを
// ActivityMainBindingというViewオブジェクトに変換
binding = ActivityMainBinding.inflate(layoutInflater)
// layoutInflaterはXMLレイアウトファイルを解析してViewオブジェクトを生成するサービスのようです。