[Android] findViewByIdの代わりにView Bindingを使ってみた

View BindingはViewを操作するコードを簡単に記述できる機能で、XMLレイアウトごとBindすることができます。
View Binding が「大概のケース」でfindViewByIdの後継として使えます。例外もありまったりしますが…

Android Studio
2021.1.1




View Binding の設定

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

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

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

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

cat44 00 100x100 - [Android] findViewByIdの代わりにView Bindingを使ってみた
Kotlinでは以前は「Kotlin Android Extensions」を使ってコードを簡略化できていましたが非推奨となりました。 V...

 

 

build.gradleの設定

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

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

 
build.gradle(Module: xxx)


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


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


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

1x1.trans - [Android] findViewByIdの代わりにView Bindingを使ってみた

 

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() に渡す



冗長なので短縮できます


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

 

サンプルコード

 
ButtonとTextViewを使ったJavaコードのサンプルをView Bindingにしてみます。
 

test button 00 100x100 - [Android] findViewByIdの代わりにView Bindingを使ってみた
アプリの作り方の基本を習得するために、ボタンを押したら文字が変わるという簡単なアプリを作ってみます。

 

MainActivity.java


 
activity_main.xml


 
strings.xml


 
build.gradle


References:
ビュー バインディング – Android Developers
findViewById
BuildFeatures | Android Developers

シェアする

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

フォローする