カテゴリー
Kotlin言語

View Binding の使い方 (Kotlin編)

これからは、findViewById の代わりに、View Binding を使うそうです。ということでまとめておきますね


View Binding とは

View Binding についてです

  • View binding を導入すると findViewById を使わずにUI画面の View(部品)に直接アクセスできます
  • Android Studio 3.6 以降で使うことができます。インストールは不要(すでにインストールされている)。ただしプロジェクト毎にモジュールの build.gradle ファイルに設定が必要です
  • 設定の書き方は Android Studio 4.0 までとそれ以降で少々異なるので注意してください
    • Android Studio 3.6 での設定方法は Android Studio 4 でもとりあえず有効(いちおう動く)。ただし Android Studio 5.0 では廃止される(動かなくなる)そうです
    • View Binding を使うのであればできるだけ Android Studio 4.0 以降を使います

View Binding を使う準備

新規にプロジェクトを作成したら、モジュールの build.gradle を開いて view binding を有効にする設定をしておきます

  1. Android Studio でプロジェクトを開く
  2. Project から build.gradle (Module) を開く
    • Project の表示を Android にして「 Gradle Scripts > build.gradle (Module:~)」をダブルクリック
  3. 以下のように記述します(上が Android Studio 3.6 用、下が Android Studio 4.0 以降用)
// Available in Android Gradle Plugin 3.6.0
android {
    viewBinding {
        enabled = true
    }
}
// Android Studio 4.0
android {
    buildFeatures {
        viewBinding = true
    }
}
  • View Binding は自動でXMLファイルを扱うためのクラス(バインディングクラス)を生成します。このクラスを使ってコードからUI部品に簡単にアクセスするしくみです
    • クラスの自動生成をしてほしくないXMLレイアウトファイルがあれば、ファイル内に tools:viewBindingIgnore="true" と記述しておきます
  • 自動生成されるクラス(バインディングクラス)の名前は、XMLファイル名(snake_case)を PascalCase(UpperCamelCase)に変換してから Binding をくっつけたものになります
    • たとえば activity_main.xml ファイルからは ActivityMainBinding クラスが生成されます
    • camelCase , snake_case , PascalCase などの  命名法についてはこちら  にまとめてあります
  • 生成されたクラス(バインディングクラス)には次のようなフィールドやメソッドがあります
    • レイアウト内の View 部品(レイアウト時に id をつけなかったものは含まれない)
    • root ・・・ルートビュー(UI部品の土台になっているレイアウトView)への参照
    • getRoot() メソッド・・・ルートビュー(root)を参照
    • inflate() メソッド・・・バインディングクラスのインスタンスを生成します

Activity での View Binding の使い方

activity_main.xml から自動生成された ActivityMainBinding クラスを使うんですね

うん、MainActivity.kt の中で View(UI部品)を操作するには onCreate() メソッドに次のように記述しておくの

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)
}
  1. インスタンスを生成・・・バインディングクラスから inflate() メソッドを使ってインスタンスを生成
  2. ルートビューへの参照を取得・・・バインディングクラスのルートビュー(root)への参照を取得(rootプロパティ、または getRoot() メソッドを使う)
  3. 画面のアクティブビュー(表示されるビュー)に設定する・・・ルートビューへの参照を setContentView() に渡す

上記の準備ができていれば、UIに追加したTextViewidname)や Buttonid button)には次のようにしてアクセスできます

binding.name.text = "文字列"
binding.button.setOnClickListener { タップされたときの処理 }

Fragment での View Binding の使い方

Fragment で使うときはちょっと工夫します

  • Fragment・・・Activity の上で動くActivityより高機能なActivityみたいなもの。タブのように複数画面をひとつにまとめたようなものを扱うときに使います
  • Fragment で使うときはこんな風に設定します(メモリリークが起きないようにするため少しややこしい)
private var _binding: ResultProfileBinding? = null
private val binding get() = _binding!!

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
): View? {
        _binding = ResultProfileBinding.inflate(inflater, container, false)
        val view = binding.root
        return view
}

override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
}

上の準備ができちゃえば、UIに追加したTextViewid name)や Buttonid button)には Activity のときと同じようにアクセスできます

binding.name.text = "文字列"
binding.button.setOnClickListener { タップされたときの処理 }

参考