[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







アプリ開発が上達するお勧め

アプリ開発を始めたけどわからないところがあり、誰かに聞きたいけど周りにはそんな人はいない…あるいは、会社で働いていて日中そんなに時間をとれないなど、オンラインのプログラミングスクールがいいでしょう。

TECH ACADEMY
オンライン説明会


侍エンジニア塾
侍エンジニア塾 無料体験レッスン


とても簡単なことなのに本やネットの画像だけでは分かりにくいことはあります。実際に質問してピンポイントで教えてもらうと、なんだそんなこと、と言うのがけっこうあります。


シェアする

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

フォローする