[Android & Kotlin] View Binding はfindViewByIdの後継

Kotlinでは以前は「Kotlin Android Extensions」を使ってコードを簡略化できていましたが非推奨となりました。
View Binding が「大概のケース」でfindViewByIdの後継として使えます。例外もありますが

Android Studio
2021.1.1 patch 2




View Binding の設定

 
XMLレイアウトファイルからIDを読みだして、findViewById を使ってコードと結びつけるのが昔からの方法です。

Kotlinでは kotlinx.android.synthetic を使って簡略化できていましたが、非推奨となりました。

findViewById の不都合なことがある場合として、

  • nullable
    • findViewByIdの戻り値はnullableで呼び出しタイミングが悪い、あるいは間違ったidを呼び出してnullになる可能性が潜んでいる
  • 型の指定
    • 型安全ではないので型を指定して呼び出す必要がある
  • 紐づけが面倒
    • たくさんの紐づけをする場合に顕著に表れる冗長的な作業、バグの元

等があります。1つ2つであればfindViewById は簡単ですが大きなプロジェクトでは
View Binding が推奨されるでしょう。

 

 

build.gradleの設定

 
build.gradle ファイルに viewBinding 要素を追加し true にします。

同じ名前のファイルが2つあり、プロジェクト用(Project: xxx)とモジュール用(Module: xxx.app)で、モジュール用を使用します。
ターゲットのAPIレベルやライブラリーの情報が設定されます。

 
build.gradle(Module: xxx)


この他に以下のような設定でも通りました。


あるいは、gradle.properties に以下のような記述を追加しても可能です


設定後に「Sync Now」を実行するのを忘れずに
また反映されるのに時間がかかることもあります

1x1.trans - [Android & Kotlin] View Binding はfindViewByIdの後継

 

Binding Classを生成

 
プロジェクトのレイアウトファイル毎にViewBinding Class を作成します。


例えば、activity_main.xml の場合はactivity_mainをキャメルケースに変換して、package name とdatabindingを頭に付け、末尾に「Binding」を追加することで生成します。

[package name].databinding.[XMLレイアウトファイル名から]Binding

activity_main.xml >> ActivityMainBinding
sub_layout.xml >> SubLayoutBinding
main.xml >> MainBinding

activity_main.xmが以下のような場合


Binding Class のActivityMainBindingには3つのフィールドがあります。

  • text_view という名前の TextView フィールド
  • edittext という名前の EditText フィールド
  • button という名前の Button フィールド

bindingで以下のように参照できます


ImageViewには ID が無いので、このバインディングクラス内にそのビューへの参照は存在しません。

Binding Classには getRoot() メソッドも含まれるので、レイアウトファイルの
root viewを直接参照できます。上記のActivityMainBindingクラスでは getRoot() により
constraintlayout の root view を返します。

 

Activityへの実装

 
MainActivityの onCreate() で次の手順を実施

  • Binding Classのインスタンスを生成
    • Binding Classに含まれる静的 inflate() メソッドを呼び出し生成
  • getRoot()を呼び出してroot viewへの参照を取得
  • root view を setContentView() に渡す



冗長なので短縮できます


以上で設定ができました。

  
 
 

References:
Migrate from Kotlin synthetics to Jetpack view binding
Kotlin Android Extensions の未来
ビュー バインディング – Android Developers
findViewById
BuildFeatures | Android Developers

シェアする

  • このエントリーをはてなブックマークに追加

フォローする