View Binding facilita la escritura de código que interactúa con las vistas. Aquí se explica cómo configurarlo en su proyecto Android Gradle.
La mayoría de los desarrolladores de Android probablemente estén familiarizados con el clásico findViewById()
método. Pásele un ID de una de las Vistas en su diseño XML y devolverá una referencia a la versión inflada de esa Vista. Todo eso suponiendo que haya pasado la ID correcta y que la Vista realmente exista. findViewById()
no tiene comprobaciones integradas para evitar que intente recuperar una Vista que no puede recuperar. Ingrese a Ver enlace.
En lugar de usar findViewById()
en cada Vista que desee, View Binding genera automáticamente una clase de enlace para cada diseño XML. Cada Vista con un ID se agrega automáticamente a la clase, por lo que puede hacer referencia a ellas directamente.
Agregar View Binding a un proyecto de Android Gradle es súper simple.
Configuración de Gradle
View Binding está habilitado a nivel de módulo en Gradle. Si tiene varios módulos, deberá habilitarlos individualmente para cada uno.
En el android
bloque en su nivel de módulo build.gradle
, agregue la opción para habilitar Ver enlace.
android {
...
buildFeatures {
viewBinding true
}
}
Puede haber una advertencia sobre acceso ilegal, pero es un error de pelusa y se puede ignorar con seguridad.
Sincronice el proyecto y se habilitará View Binding. Es fácil.
Usando el enlace de vista
Hay algunas formas de utilizar View Binding, pero antes de que eso suceda, hablemos de cómo se generan las clases de enlace.
Sintaxis del nombre de clase
Supongamos que tiene un diseño XML llamado some_layout.xml
. Su clase de enlace correspondiente se denominará SomeLayoutBinding
. Ese patrón es válido para todos los archivos.
Cada palabra (separada por guiones bajos en el nombre del archivo) se escribirá en mayúscula y se eliminarán los guiones bajos. "Encuadernación" luego se agrega al final.
Creación de instancias con vista existente
Si ya ha inflado el archivo de diseño y tiene una referencia a la raíz del diseño, puede indicarle a la clase de enlace Ver que use el diseño existente.
Kotlin:
val binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.bind(someLayoutRoot /* should be a View instance */);
Por ejemplo, si quisiera utilizar la clase de enlace en un Fragmento, se vería así.
Kotlin:
classSomeFragment : Fragment(R.layout.some_layout) {
//Lazy initialization means bind() won't be called until "binding" is referenced.
private val binding by lazy { SomeLayoutBinding.bind(view) }
override fun onViewCreated(view: View, savedInstanceState: Bundle?){
super.onViewCreated(view, savedInstanceState)
//Once this method is called, you can start using the binding.
}
}
Java:
publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;publicSomeFragment(){
super(R.layout.some_layout);
}
@Override
publicvoidonViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
//Initialize the binding.
binding = SomeLayoutBinding.bind(view);
}
}
Creación de instancias con nueva vista
La clase vinculante también puede encargarse de inflar el diseño por usted.
Kotlin:
val binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */)
Java:
SomeLayoutBinding binding = SomeLayoutBinding.inflate(layoutInflater /* should be a LayoutInflater instance */);
Este método es útil tanto en Fragmentos como en Actividades.
Un ejemplo fragmento se vería algo como lo siguiente.
Kotlin:
classSomeFragment : Fragment() {
private val binding by lazy { SomeLayoutBinding.inflate(LayoutInflater.from(requireContext())) }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?){
//The "root" of the binding class is the root of its layout.
return binding.root
}
}
Java:
publicclassSomeFragmentextendsFragment{
private SomeLayoutBinding binding = null;
@Override
publicvoidonCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
//Initialize the binding.
binding = SomeLayoutBinding.inflate(inflater);
//The "getRoot()" method of the binding class returns the root of the layout.
return binding.getRoot();
}
}
Un ejemplo de actividad se vería algo como lo siguiente.
Kotlin:
classSomeActivity : AppCompatActivity() {
private val binding by lazy { SomeLayoutBinding.inflate(layoutInflater) }override fun onCreate(savedInstanceState: Bundle?){
super.onCreate(savedInstanceState)
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.root)
}
}
Java:
publicclassSomeActivityextendsAppCompatActivity{
private SomeLayoutBinding binding = null;@Override
protectedvoidonCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//Instantiate the binding.
binding = SomeLayoutBinding.inflate(getLayoutInflater());
//This is equivalent to calling "setContentView(R.layout.some_layout)" but allows use of the binding class.
setContentView(binding.getRoot());
}
}
Vistas de referencia
Ahora que la clase de enlace View está configurada y lista para usar, es hora de usarla.
Digamos que el contenido del some_layout.xml
son algo como lo siguiente:
android:
...>
android:
...
/>
android:
...
/>
android:
...>
android:
...
/>
LinearLayout>
LinearLayout>
Hay muchas identificaciones a las que hacer referencia en el código. Pero siempre que tenga una instancia de la clase vinculante, la referencia será fácil.
En Kotlin, las vistas hacen referencia a variables que coinciden con sus ID, con algunos cambios. Se eliminan los guiones bajos y la cadena resultante tiene un formato camel. Por ejemplo, para hacer referencia some_frame_layout
del código, usarías binding.someFrameLayout
. El someFrameLayout
La variable será una instancia de FrameLayout.
val someFrameLayout: FrameLayout = binding.someFrameLayout
En Java, se hace referencia a las Vistas mediante métodos getter que coinciden con sus ID, con un formato similar a Kotlin. Por ejemplo, para hacer referencia some_frame_layout
, usarías binding.getSomeFrameLayout()
. El método devolverá una instancia de FrameLayout.
FrameLayout someFrameLayout = binding.getSomeFrameLayout();
Las referencias de Vista también se aplanan en el enlace. Referenciando inner_imageview
es lo mismo que hacer referencia some_frame_layout
.
Conclusión
Como estoy seguro de que puede ver, View Binding en Android es fácil de implementar y de usar. En muchos casos, es más fácil de usar que findViewById()
.
Para obtener más detalles sobre la implementación de View Binding, junto con algunos ejemplos, consulte la documentación oficial de Google.