Android ViewBinding Extension

237 阅读1分钟

分享給大家最近做的 ViewBinding Extension 可以適用在 Activity、Fragment 與 ViewHolder 等情境下。

Github 連結在這裡 github.com/Jintin/Bind…

  1. Activity 直接繼承 BindingActivity 然後指定 ViewBinding 的實體就可以直接拿到正確的 viewBinding object 了。
class MainActivity : BindingActivity<ActivityMainBinding>() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding.label.setText(R.string.activity_label)
    }
}
  1. 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)
        }
    }
}
  1. 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 支持,感謝大家。