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.