AndroidのJetpack View Binding

投稿者: | 2021年4月20日

AndroidのView Binding

AndroidのUIで面倒なのはリソースとソースコードを結びつけなくてはいけないところだ。これまでは setContentView(R.layout.activity_main) のようにRクラスを使ってリソース内のオブジェクトとソースコードをリンクさせていた。

これが一つのバグの温床で、リソースが見つけられずにNull Pointer Exceptionを起こすことも少なくなかった。

その対策の一つが本稿のView Bindingだ。似たようなものにJetpack Data Bindingというものがあるが、View Bindingの方が効率もよく推奨されている。

このData Bindingのページには

Note: In many cases, view binding can provide the same benefits as data binding with simpler implementation and better performance. If you are using data binding primarily to replace findViewById() calls, consider using view binding instead.

と書かれている。

実際の手順は大きく分けて4つ。

  1. 使用の宣言
  2. Binding変数の追加
  3. Binding変数の初期化
  4. リソースの呼び出し

である。

使用の宣言

二つあるbuild.gradleのうち、Module〜:appの方のAndroidセクションに下の項目buildFeaturesを追加、Sync Now(右上方に出てくる青い文字)を実施。

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.1"

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    .
    .
    .
    buildFeatures {
        viewBinding true
    }

Binding変数の追加

View Bindingを使いたいAcitivityのソースコード.ktのActivityクラスにおいてbinding用の変数を追加する。一番右はそのActivityの名前にBindingが付いたものとなる。これを追加するとAndroid Studioがimport文を追加してくれる。(上でSyncしていれば)

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

Binding変数の初期化

ActivityクラスのonCreateメソッドでbinding変数を初期化。下のソースコードではわざと残してあるが、setContentView(R.layout.activity_main)は削除する。

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

Binding変数を利用したリソースの呼び出し

たとえばTextViewにhelloTextというIDを割り振っていた場合には以下のようにして呼び出すことができる。

binding.helloText.text = "Hello World!"
binding.helloText.textSize = 48F

まとめ

これまでのRクラスを使ったものや、Kotlin限定のSynthetic Propertyより使いやすく、なによりRクラス方式に見られたNull Pointer Exceptionが生じないのは大きい。

過去のRクラス方式をすべてView Bindingに書き換えるのは手間だが、新規に作るならView Bindingで作った方が良いと思う。

また、この方式だと必然的にリソースIDを付ける習慣がつくのでEspressoなどの導入もスムーズに行くだろう。

メリット、デメリット、Data Bindingとの差異など詳細については本家の説明https://developer.android.com/topic/libraries/view-bindingを参照して欲しい。

その後見つかった問題

こちらで既に確認している問題として、古いprojectをView Binding対応にしようとすると生成するJavaのBinding関連ソースコードが不完全なようで、XXclassがないといってビルドはできても実行できないことがあった。

View BindingがAndroid Studio 3.6以降で対応した物なので、それより古いと上記以外の手を入れる必要があるのだろう。

Kotlin言語のバージョン1.5リリースイベントでJetBrainsスタッフが強調していたように、いつも新しい物に乗り換えていくことがAndroidの開発では必要なのかも知れない。一気にバージョンを上げるとはまってしまう。

コメントを残す