Data Binding para Android con Kotlin

Desde el inicio de Android la forma de obtener acceso a un View era así:

val nameTextView: TextView = findViewById(R.id.name_text) as TextView

Y estaba bien, solo que se podía mejorar porque tiene sus desventajas:

  1. Es aburrido de hacer cuando tienes 10 o más views, tienes que ir a ver a tu layout.xml el id que le diste. Además ¿Qué es eso de tener que escribir 2 veces el tipo de View que vas a usar? 😪.

  2. Si olvidaste crear el nameTextView y lo quieres usar la app truena (nullPointerException), pero no te avisa en tiempo de compilación, sino en tiempo de ejecución, es decir, te avisa ya que estás usando la app, cuando no hay mucho que hacer más que lanzar una nueva versión, esto es tardado y para entonces ya les tronó a muchos de tus usuarios.

  3. Cada vez que llamas findViewById, Android va y busca el id de entre el montón que tienes en tu app, es un proceso pesado y poco eficiente.

Por eso Google decidió sacar a la luz algo llamado data binding (Algo así como enlace de datos) que hace tu código más rápido, limpio y menos repetitivo.

Lo primero que hay que hacer es agregar soporte para data binding en tu archivo build.gradle (app):

// En la parte superior agrega el plugin de 'kotlin-kapt'
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt' <--- Aquí
}

android {
    ...

    buildFeatures {
        dataBinding true
    }
}

Luego en tu layout.xml (por ejemplo activity_main.xml), y en la pestaña del documento o en el ViewGroup padre da clic en alt + N (option + N en Mac) y selecciona “Convert to data binding layout”

Verás que todo se encierra dentro de <layout

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            id="@+id/name_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
    </LinearLayout
</layout>

Esto también creará automáticamente una clase binding con el nombre de tu Activity, por ejemplo para MainActivity creará una clase ActivityMainBinding, o para LoginActivity creará ActivityLoginBinding

Ahora en el método onCreate() de tu Activity, en vez de usar setContentView(R.layout.activity_main) puedes crear un objeto binding así:

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

Y en vez de usar el findViewById(R.id.name_text) simplemente podrás usar el binding.nameText y esto será tu TextView, por ejemplo para agregarle texto puedes hacer lo siguiente

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

    // binding.nameText es el TextView de tu layout, esto es lo mismo que hacer
    // findViewById(R.id.name_text)
    val nameTextView = binding.nameText
    nameTextView.text = "Ragnar Lothbrok"

    // También puedes simplemente escribir 
    // binding.nameText.text = "Ragnar Lothbrok"
}

El nameText del binding.nameText se generó automáticamente a partir del id del TextView name_text, por ejemplo si tienes un ImageView llamado profile_image, se generaría también un binding.profileImage que podrías usar directamente, no más findViewById.

Con dataBinding obtienes 3 ventajas que se contraponen a las desventajas del inicio:

  1. El código es más limpio y ahorras lineas de código porque no necesitas declarar los views.

  2. Los errores ocurren en tiempo de compilación, si ocurre un error lo sabrás antes de ejecutar la app.

  3. Como todo se pre-carga en tiempo de compilación, el proceso es más eficiente al usar los views.

Publicado por Jesus Almaral

Soy ingeniero en Mecatrónica con maestría en Machine Learning, tengo experiencia en lenguajes como Java, Kotlin, Matlab, Android, Python, etc. Actualmente soy desarrollador de aplicaciones móviles, me gusta la música y toco la guitarra, me gusta mucho saber cosas sobre el universo, leer y comer tacos. También me apasiona enseñar.

2 comentarios sobre “Data Binding para Android con Kotlin

    1. Hola Erwin buena pregunta, la diferencia es que con Data Binding puedes agregar variables a tu xml y hacer el binding de la variable directamente sin tener que usar la Activity, ejemplo:

      Incluso puedes poner un viewModel como variable y así no tener que agregar observers en la Activity, mientras que con ViewBinding se puede hacer todo lo demás de crear un objeto binding y usarlo en la Activity pero no se pueden agregar variables .

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .

A %d blogueros les gusta esto: