- una breve introducción:
En términos sencillos, ViewBinding puede ayudar a los desarrolladores a encontrar rápidamente controles con identificadores, sin más preámbulos.
- Fácil de usar:
Configure en el archivo .gradle debajo del módulo que debe usarse:
Android { buildFeatures { viewBinding = verdadero } }
Una vez completada la configuración, se puede utilizar.
Por ejemplo:
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 {}
}
}
La clase ActivityTextBinding es generada por el archivo Activity_text.xml correspondiente,
Si no desea que xml genere el archivo de enlace correspondiente, puede agregarlo al xml y etiquetarlo
herramientas:viewBindingIgnore="true "
- Encapsular la clase base BaseActivity
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
}
}
- Encapsular la clase base BaseFragment
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
}
}
- Aviso
Si se habilita la confusión, agregue el archivo proguard-rules.pro:
-keep class * implementa androidx.viewbinding.ViewBinding { *; }
ya terminaste