- a brief introdction:
In plain English, ViewBinding can help developers quickly find controls with ids, without further ado..
- Simple to use:
Configure in the .gradle file under the module that needs to be used:
android { buildFeatures { viewBinding = true } }
After the configuration is complete, it can be used
For example:
class TextActivity : AppCompatActivity() {
lateinit var binding:ActivityTextBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityTextBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.btn.setOnClickListener {}
}
}
The ActivityTextBinding class is generated by the corresponding activity_text.xml file,
If you don't want xml to generate the corresponding Binding file, you can add it to the xml and tag
tools:viewBindingIgnore="true "
- Encapsulate BaseActivity base class
abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
protected lateinit var binding: VB
override fun onCreate(savedInstanceState: Bundle?) {
initial()
super.onCreate(savedInstanceState)
binding = createBinding()
setContentView(binding.root)
initView()
initData()
}
open fun initial(){}
protected abstract fun initView()
protected abstract fun initData()
private fun createBinding(): VB {
val vbClass = getVBClass()
val inflateMethod = vbClass.getMethod("inflate", LayoutInflater::class.java)
return inflateMethod.invoke(null, layoutInflater) as VB
}
@Suppress("UNCHECKED_CAST")
private fun getVBClass(): Class<VB> {
val type = javaClass.genericSuperclass as ParameterizedType
val vbClass = type.actualTypeArguments[0] as Class<VB>
return vbClass
}
}
- Encapsulate BaseFragment base class
abstract class BaseFragment<VB : ViewBinding> : Fragment() {
protected lateinit var binding: VB
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = createBinding(inflater, container)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
initView()
initData()
}
abstract fun initData()
protected abstract fun initView()
private fun createBinding(inflater: LayoutInflater, container: ViewGroup?): VB {
val vbClass = getVBClass()
val inflateMethod = vbClass.getMethod("inflate", LayoutInflater::class.java, ViewGroup::class.java, Boolean::class.java)
return inflateMethod.invoke(null, inflater, container, false) as VB
}
@Suppress("UNCHECKED_CAST")
private fun getVBClass(): Class<VB> {
val type = javaClass.genericSuperclass as ParameterizedType
val vbClass = type.actualTypeArguments[0] as Class<VB>
return vbClass
}
}
- Notice
If confusion is enabled, please add in the proguard-rules.pro file:
-keep class * implements androidx.viewbinding.ViewBinding { *; }
you're done