分享給大家最近做的 ViewBinding Extension 可以適用在 Activity、Fragment 與 ViewHolder 等情境下。
Github 連結在這裡 github.com/Jintin/Bind…
- Activity 直接繼承 BindingActivity 然後指定 ViewBinding 的實體就可以直接拿到正確的 viewBinding object 了。
class MainActivity : BindingActivity<ActivityMainBinding>() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding.label.setText(R.string.activity_label)
}
}
- Fragment 方法跟 Activity 很像,但特別需要注意的是,binding 這個物件在 onDestroyView 之後會被清掉避免 memory leak。
class MainFragment : BindingFragment<FragmentMainBinding>() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.button.setOnClickListener {
binding.button.setText(R.string.fragment_label)
}
}
}
- ViewHolder ViewHolder 就更單純一點,ViewGroup 現在有個 toBinding 的 extension function,只要直接呼叫就可以拿到正確的 binding type object。
// inside adapter
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return MainViewHolder(parent.toBinding())
}
// ViewHolder
class MainViewHolder(private val binding: AdapterMainBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(data: String) {
binding.name.text = data
}
}
最後特別要注意的是 BindingExtension 這個 library 是使用 relfection 來達成以上這些功能的,如果有 proguard 需求的話需要把 ViewBinding 相關的 inflate 方法保留。單一 module 的範例如下:
-keep public class com.jintin.bindingextension.app.databinding** { <methods>; }
有任何問題也歡迎在 Github 開 issue 或是上 pr,如果有幫助的話也歡迎大家給 star 支持,感謝大家。