ViewBinding is an amazing tool for Android but it's not so fit in Android development as we still have to do some config. BindingExtension is built to provide a simpler usage.
Add Jitpack repository to your root build.grable:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}Then add dependency in your module build.gradle:
dependencies {
implementation 'com.github.jintin:BindingExtension:3.1.0'
}First of all, BindingExtension using refelction a lot to link many things internally in order to provide simple usage.
To prevent having trouble with proguard, please remember to exclude ViewBinding related method in your proguard-rules file like this:
-keepclassmembers class * implements androidx.viewbinding.ViewBinding {
public static ** inflate(...);
}
Extend from BindingActivity with your ViewBinding type then you can use binding directly after calling super.onCreate(savedInstanceState) and you don't have to call setContentView anymore:
class MainActivity : BindingActivity<ActivityMainBinding>() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding.label.setText(R.string.activity_label) } }
Extend from BindingFragment with your ViewBinding type then you can use binding directly after super.onCreateView(inflater, container, savedInstanceState) is called:
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) } } }
BindingExtension provide an extension function for ViewGroup, you can call ViewGroup.toBinding() in onCreateViewHolder to get your desire type of ViewBinding.
And ViewHolder can than access ViewBinding directly without further transformation.
// 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 } }
You can go to ./app module for more information.
Bug reports and pull requests are welcome on GitHub at https://github.com/Jintin/BindingExtension.