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
onCreate で DataBindingUtil#setContentView を呼びます。
override fun onCreate(savedInstanceState: Bundle?) {
val binding = DataBindingUtil.setContentView<MainActivityBinding>(this, R.layout.main_activity)
// use binding
}
プロパティにする必要がある場合は、val by lazy で DataBindingUtil#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
onCreateView で DataBindingUtil#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 な var で onCreateView で DataBindingUtil#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 の記述漏れも防げます。
使い方は以下の記事を参照してください。
ここから先は
¥ 100
この記事が気に入ったらチップで応援してみませんか?