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: EditTextprivate 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_mainbinding.getRoot() );
setContentView(R.layout.activity_mainbinding.root)
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.