[Android] ViewBindingを使って安全にUI操作を行う方法

スポンサーリンク

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です。
違いを簡単にまとめると以下の通りです:

項目ViewBindingDataBinding
目的型安全なView参照UIとデータのバインディング
宣言の必要なし<layout>タグが必要
パフォーマンス軽いやや重い

簡単にまとめると、「とにかく安全にViewを扱いたい」ならViewBinding、
「双方向データバインディングを使いたい」ならDataBindingです。

まとめ

  • ViewBindingは型安全にUIを扱える
  • FragmentではonDestroyViewでnullにするのが大事
  • findViewByIdやSyntheticはもう不要

最近のAndroid開発では、DataBindingよりもViewBindingが主流になっています。
ミスを減らしつつ可読性も上がるので、まだ使っていない人は今日から試してみてくださいね。

コメント

タイトルとURLをコピーしました