AndroidでViewBindingを使って安全にUI操作を行う方法
Androidアプリでの開発中、「findViewById多すぎてツライ…」「NullPointerExceptionで落ちた…」という経験、ありませんか?
そんな時に役立つのが、ViewBindingです。
今回は、実際の使い方からFragmentでの注意点まで、実践的に紹介します。
ViewBindingとは?
ViewBindingは、XMLレイアウトの各Viewに対して型安全な参照を生成してくれる機能です。
Kotlin SyntheticやfindViewByIdのように、IDを文字列で参照する必要がなくなります。
有効化する方法
まずは、モジュールの build.gradle
にViewBindingを有効化します。
// build.gradle(:app)
android {
buildFeatures {
viewBinding = true
}
}
これで、ビルド時に自動的にバインディングクラスが生成されるようになります。
Activityでの使い方
まずはActivityの例です。
レイアウトファイル名が activity_main.xml
の場合、
自動生成されるクラス名は ActivityMainBinding
になります。
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.textViewTitle.text = "こんにちは、ViewBinding!"
binding.buttonOk.setOnClickListener {
Toast.makeText(this, "ボタンが押されました", Toast.LENGTH_SHORT).show()
}
}
}
このように、レイアウト内のViewを型安全にアクセスできます。
キャストも不要で、ビルド時にIDの存在チェックが行われるためミスを防げます。
Fragmentでの使い方
Fragmentでは、ライフサイクルの都合でViewが破棄されるタイミングに注意が必要です。
そのため、onDestroyViewでbindingをnullにするのが鉄則です。
class HomeFragment : Fragment() {
private var _binding: FragmentHomeBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentHomeBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textHome.text = "ViewBindingで安全にUI操作"
binding.buttonNext.setOnClickListener {
Toast.makeText(requireContext(), "次へ", Toast.LENGTH_SHORT).show()
}
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}
この書き方により、FragmentのView破棄後にbindingを触ってもクラッシュしなくなります。
最近のGoogle公式サンプルもこの形式を採用しています。
DialogFragmentでも使える?
もちろん可能です。DialogFragmentでも、ActivityやFragmentと同じように使えます。
ただし、onCreateDialog()
内でinflate()
するように注意しましょう。
DataBindingとの違い
ViewBindingとよく混同されるのがDataBindingです。
違いを簡単にまとめると以下の通りです:
項目 | ViewBinding | DataBinding |
---|---|---|
目的 | 型安全なView参照 | UIとデータのバインディング |
宣言の必要 | なし | <layout>タグが必要 |
パフォーマンス | 軽い | やや重い |
簡単にまとめると、「とにかく安全にViewを扱いたい」ならViewBinding、
「双方向データバインディングを使いたい」ならDataBindingです。
まとめ
- ViewBindingは型安全にUIを扱える
- FragmentではonDestroyViewでnullにするのが大事
- findViewByIdやSyntheticはもう不要
最近のAndroid開発では、DataBindingよりもViewBindingが主流になっています。
ミスを減らしつつ可読性も上がるので、まだ使っていない人は今日から試してみてくださいね。
コメント