findViewById vs viewBinding
Kotlin での Android アプリ開発勉強中のみやジックです。
現在は Google の提供している Android Basics in Kotlin を進めています。
Unit 2:Layouts の Pathway1で viewBinding が出てきて、「ん?」ってなったので頭の中を整理するためにこの記事を書きます。
viewBinding とはなんぞ
コードが View に対するメソッドを呼び出したり、その属性にアクセスしたりする前に、コードで Button や TextView などの View への参照を調べる必要があります。Android フレームワークには、findViewById() というメソッドが用意されており、View の ID を指定してその参照を返すという、まさにここで必要な操作を行えます。このアプローチは効果的ですが、アプリにビューを追加すると UI が複雑になるため、findViewById() の使用が難しくなる可能性があります。
まあ、View をコードから参照するときに便利にやってくれるやつ。
これまでは findViewById()を使って参照してたけど、それより楽になるやで~って書いてある。
ちなみに Bind って聞くとなんか縛り付けるイメージあるけど、関連づけや参照のような意味っぽい
findById より本当に楽なん?
実際にやってみた。
まずは findById での参照をUnit 1:KotlinBasics の Pathway4を参考にやってみる。
まず、viewsと呼ばれる部品をactivity_main.xmlに配置します。今回はTextViewとButtonの二つを配置しました。
MainActivity.ktからfindByIdでTextViewとButtonの参照をして、Buttonの押下でtextを変更できるようにする。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val rollButton: Button = findViewById(R.id.button)
val textView: TextView = findViewById(R.id.textView)
rollButton.setOnClickListener {
textView.text = "changed"
}
}
}
こんな感じになる。それぞれのviewsごとにfindViewByIdを呼ぶことになる。
次にviewBindingで書き直してみる。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.button.setOnClickListener {
binding.textView.text = "changed"
}
}
}
※ viewBindingを使うときはbuild.gradleで設定する必要があるので注意
build.gradle内のandroidブロック内に下記を追記して、SyncNowをクリック
buildFeatures {
viewBinding = true
}
これでviewBindingを用いて同じ挙動の実装ができた。
MainActivityクラス内では、viewの数だけfindByIdを呼ぶ必要が無くなった。viewが増えれば増えるほどviewBindingの利点は大きくなりそう。
今回書いたコードのリポジトリ