見出し画像

DataBindingUtil vs DataBinding-ktx

DataBinding-ktx は DataBindingUtil と比較して何が良いのかを説明します。

3行まとめ

・Activity と Fragment で同じように宣言できる
・ローカル変数で良い場合でもプロパティとして宣言する必要がある
setLifecycleOwner の呼び出し忘れを防止できる

Activity と Fragment での binding 変数の宣言方法

 DataBindingUtil
Activity と Fragment でメソッドが異なります。プロパティにする場合、Activity は val by lazy にできますが、Fragment は val by lazy できません。

 DataBinding-ktx
Activity と Fragment どちらも val by dataBinding で宣言します。

変数のスコープ

 DataBindingUtil
必要に応じてローカル変数またはプロパティで宣言します。

 DataBinding-ktx
プロパティでの宣言が必須なため、必要以上にスコープが広くなってしまう場合があります。

LiveData 対応

 DataBindingUtil
自分で忘れずに setLifecycleOwner を呼び出す必要があります。

 DataBinding-ktx
val by dataBinding で自動的に setLifecycleOwner が呼ばれているため自分で呼び出す必要がありません。

・・・

詳細な書き方の比較

 DataBindingUtil in Activity

onCreateDataBindingUtil#setContentView を呼びます。

override fun onCreate(savedInstanceState: Bundle?) {
    val binding = DataBindingUtil.setContentView<MainActivityBinding>(this, R.layout.main_activity)
    // use binding
}

プロパティにする必要がある場合は、val by lazyDataBindingUtil#setContentView を呼びます。
onCreate で binding を使用しないと setContentView されないので注意してください。

private val binding: MainActivityBinding by lazy {
    DataBindingUtil.setContentView(this, R.layout.main_activity)
}
override fun onCreate(savedInstanceState: Bundle?) {
    // use binding
}

 DataBinding-ktx in Activity

val by dataBinding でプロパティとして宣言します。

private val binding: MainActivityBinding by dataBinding(R.layout.main_activity)
override fun onCreate(savedInstanceState: Bundle?) {
    // use binding
}

・・・

 DataBindingUtil in Fragment

onCreateViewDataBindingUtil#inflate を呼びます。

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val binding = DataBindingUtil.inflate<MainFragmentBinding>(this, R.layout.main_fragment, container, false)
    return binding.root
}

プロパティにする必要がある場合は、
nullable な varonCreateViewDataBindingUtil#inflate を呼びます。
※ Fragment は View の再生成があるので val by lazy は使用できません。
※ BackStack や Attach/Detach を使用した場合、onDestoryView で binding に null を代入して View を解放しないとメモリリークします。その他の場合は lateinit var を使用することができます。

private var binding: MainFragmentBinding? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    binding = DataBindingUtil.inflate(this, R.layout.main_fragment, container, false)
    return binding!!.root
}

override fun onDestroy() {
    super.onDestroy()
    binding = null
}

 DataBinding-ktx in Fragment

val by dataBinding でプロパティとして宣言します。

private val binding: MainFragmentBinding by dataBinding(R.layout.main_fragment)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return binding.root
}

・・・

まとめ

DataBinding-ktx はプロパティでの宣言が必須ですが、val で宣言することができ、LiveData のための setLifecycleOwner の記述漏れも防げます。

使い方は以下の記事を参照してください。

ここから先は

0字

¥ 100

この記事が気に入ったらチップで応援してみませんか?