
これからは、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 を有効にする設定をしておきます
- Android Studio でプロジェクトを開く
- Project から
build.gradle (Module)
を開く- Project の表示を Android にして「 Gradle Scripts > build.gradle (Module:~)」をダブルクリック
- 以下のように記述します(上が 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レイアウトファイルがあれば、ファイル内に
- 自動生成されるクラス(バインディングクラス)の名前は、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) }
- インスタンスを生成・・・バインディングクラスから
inflate()
メソッドを使ってインスタンスを生成 - ルートビューへの参照を取得・・・バインディングクラスのルートビュー(
root
)への参照を取得(root
プロパティ、またはgetRoot()
メソッドを使う) - 画面のアクティブビュー(表示されるビュー)に設定する・・・ルートビューへの参照を
setContentView()
に渡す
上記の準備ができていれば、UIに追加したTextView
(id は name
)や Button
(id は 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に追加したTextView
(id は name
)や Button
(id は button
)には Activity のときと同じようにアクセスできます
binding.name.text = "文字列" binding.button.setOnClickListener { タップされたときの処理 }
参考
- Android デベロッパー > ドキュメント > ガイド > ビュー バインディング
- Use view binding to replace findViewById