View Binding


View Binding, o vinculación de vistas en castellano, es una nueva función que permite acceder a las vistas del layout de la actividad de una forma más eficiente y segura. Ya no tendrás que usar el tradicional de findViewById() cada vez que quieras usar una vista, View Binding lo hará de forma automática por nosotros. Para ver como funciona realiza el siguiente ejemplo:

Ejercicio paso a paso: Acceder a las vistas usando View Binding

Partimos del ejercicio creado en el apartado anterior. Este ha sido partiendo de una actividad de tipo Empty Activity. Sin embargo, otros tipos, como Scrolling Activity usada en Mis Lugares, ya está activado desde su creación.
 

1.    Para poder activar View Binding, añade las siguientes líneas en build.gradle (Module: app):

android {
   …
   buildFeatures {
      viewBinding true
   }
}
 

2.    Abre MainActivity y añade las líneas subrayadas:

public class MainActivity extends AppCompatActivity {
   …
   private ActivityMainBinding binding;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      binding = ActivityMainBinding.inflate(getLayoutInflater());
class MainActivity : AppCompatActivity() {
   …
   private lateinit var binding: ActivityMainBinding

   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      binding = ActivityMainBinding.inflate(layoutInflater)
      …
 

NOTA: Pulsa Alt-Intro para que se añada el import del paquete de la clase ActivityMainBinding.
Por cada layout definido en el proyecto, Android Studio va a crear automáticamente una clase para acceder a sus vistas. El nombre de esta clase se obtiene a partir del nombre del layout seguido de Binding. Por ejemplo, para activity_main.xml se genera la clase . Podemos generar un objeto de esta clase llamando al método NombreDeLaClase.inflate(). Lo que va a hacer es crear objetos Java a partir de su definición en un fichero XML. A esta operación se le conoce como inflar, inflate en inglés. Como parámetro se le pasa un inflador, que es el objeto responsable de inflar. Para no tener que crear un inflater nuevo, con getLayoutInflater() le pasamos el usado en la actividad.
Una vez definido binding, podremos acceder a todas las vistas del layout que hayan definido el atributo id=”nombre”, escribiendo .

3.    Gracias a esto ya no es necesario usar findViewById() para cada vista. Puedes eliminar el código tachado:

public class MainActivity extends AppCompatActivity {
   private EditText entrada;
   private TextView salida;
   …
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      …
      entrada = findViewById(R.id.entrada);
      salida = findViewById(R.id.salida);
   } 
class MainActivity : AppCompatActivity() {
   private lateinit var entrada: EditText
   private lateinit var salida: TextView
   …
   override fun onCreate(savedInstanceState: Bundle?) {
      … 
      entrada = findViewById(R.id.entrada)
      salida = findViewById(R.id.salida)
   } 

4.   Tras esto, aparecerán errores en los identificadores entrada y salida. Para resolverlo añade binding. delante de cada uno de estos identificadores.

5.  Otra ventaja de usar View Binding es que podemos obtener directamente la vista que contiene el layout entero usando getRoot(). Ya no va a ser necesario buscarlo como recurso. Reemplaza el siguiente código del método onCreate():
 

setContentView(R.layout.activity_main binding.getRoot() );
 
setContentView(R.layout.activity_main binding.root)
 
6.  Ejecuta la aplicación. Realmente no tiene que cambiar nada. Simplemente hemos accedido a las diferentes vistas del layout de una forma más cómoda y eficiente.

7.    Si tienes curiosidad puedes acceder a la carpeta del proyecto y buscar la siguiente ruta \ app \ build \ generated \ data_binding_base_class_source_out \ debug \ out \ com \ example \...\ databinding. Verás como en esta carpeta se ha generado una clase para cada layout del proyecto. Arrastra una de estas clases a Android Studio para abrirla. Podrás verificar como de forma automática se ha definido los diferentes elementos definidos en el layout.