自分用にViewBindingの基礎知識を残します。
ViewBindingとは?
アプリケーションのUIを結びつけるためのライブラリです。
具体的に言うと、XMLレイアウトとKotlin(java)コードでの双方向のバインディング(結びつけ)が可能となります。
結びつけ自体は、setContentViewやFindviewByIdでやったことがありますよね。
それでは、わざわざViewBindingを使うメリットは何でしょうか?
ViewBindingを使うメリット
①冗長なコードの削減
setContentViewやFindviewByIdを使わず、直接UIコンポーネントに操作を加えることができます。
XMLレイアウトとデータモデルを直接バインディングできるため、冗長で手動的なコードが減少します。
冗長なコードの例:
setContentViewでレイアウトを表示→変数を宣言→FindviewByIdで変数の中にviewと結びつける
→変数を経由してViewの操作(textViewのtextを変えるなど)
ViewBindingの例:
変数を用意→変数にsampleActivityBindingを代入 →変数名.ViewIdでViewの操作
②安全性の向上
ViewBindingはコンパイル時に検出されるため、XML内のデータバインディングが存在しないプロパティやメソッドにアクセスしようとするエラーを防ぐことができます。
これにより、実行時エラーやNullPointerExceptionのリスクを減少させ、安全性を向上させます。
変数名.ViewIdでViewIdがインフレートしたレイアウトに存在しない場合は、赤い波線が表示されて事前にエラーに気付くことができます。
ViewBindingの使い方
①ビルド環境の設定
②インフレート
③Listenerを設定
①ビルド環境の設定
ViewBindingを使用するにはbuild.gradleファイルに ViewBinding 要素を追加します。
この時点で、XMLファイルとKotlin(Java)コードとのバインディングが可能となります。
//一応これでできるらしいけどうまくできなかった謎
android{
dataBinding{
enabled = true
}
}
//これで出来ました
buildFeatures {
viewBinding = true
}
TIPS:Viewのバインディングの仕組み
ViewBindingが可能になると、プロジェクトの内部で「ある自動的な処理」が行われます。
ViewBindingライブラリは、「レイアウト内のビュー」と「データオブジェクト」をバインドするために
必要なクラス(バインディングクラス)を「自動的」に生成します。
このクラスは、レイアウトを繋ぐ架け橋だと考えてください。
このクラスのおかげで直接レイアウトを動的に操作することが出来ます。
自動生成されるクラスの特徴:
1バインディングクラスは、レイアウトファイルごとに生成されます。
2デフォルトのクラス名は、レイアウトファイルの名前がパスカルケースに変換され、
Binding サフィックス(後ろに文字がつく)が付加されたものになります。
例:
activity_main.xml
↓(ViewBindingを適用)
ActivityMainBinging(クラス)自動生成!
注意:クラスが生成されるだけで新しいファイルが作成されるわけではないです。
②インフレート
前提:activity_main.xmlにViewBindingが適用されたとします。
ActivityMainBinging(クラス)自動生成されています。
ViewBindingを使ったインフレートは非常にシンプルです。
1.Bindingクラスのインスタンスを生成
2.Bindiing.rootをreturnで返す
1.Bindingクラスのインスタンスを生成
インスタンス生成には、バインディングクラス.inflate(layoutInflater)を使います。
上記のメソッドは指定されたレイアウトを展開し、
それに対応するBinding クラスのインスタンスを生成します。
2.Binding.rootをreturnで返す
Binding.rootとは、生成されたBindingクラス内で定義されているプロパティで、
展開されたレイアウトのルートビューへの参照を提供します。
このプロパティを使うことで、バインディングされたレイアウトのルートビュー(Viewクラス)への参照を提供します。
そのため、onCreateやonCreateViewでBindiing.rootをreturnで返すことでViewを表示することができます。
private lateinit var binding : ActivityMainBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = ActivityMainBinding.inflate(layoutInflater)
return binding.root
}
③Listenerを設定
インフレートが完了すると、そのレイアウトにあるViewに直接変更を加えることができます。
”Bindingクラスのインスタンス名”.”ViewのID”で変更を加えるViewを指定することができます。
例えば、activity_main.xmlにid="addButton"のButtonViewがあったとします。
先ほどのBinding.addButtonでViewを指定することができます。
Listenerを設定をするとしたら以下のような感じでできます。
private lateinit var binding : ActivityMainBinding
//省略 onCreateViewでbindingを初期化
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
binding.addButton.setOnClickListener {
//処理を書く
}
}
最後に
Bindingは、便利!