View Binding es un nuevo mecanismo de acceso a vistas que fue lanzado junto con la versión 3.6 de Android Studio.

Históricamente ha habido muchas formas de acceder a las vistas en un XML, ya que la forma original, usando findViewById, no era especialmente cómoda.

Así que hemos tenido muchas aproximaciones, algunas de las cuales se han hecho realmente populares.

Si tuviéramos que destacar dos, estas serían ButterKnife, la librería de Jake Wharton, y los sythentics de las Kotlin Android Extensions.

Pero con View Binding vamos un poco más, allá y tiene varias ventajas que lo hacen la opción más interesante a día de hoy.

View Binding: Qué es

Desde hace un tiempo, existe en el desarrollo Android una librería conocida como Data Binding.

Esta librería permite acceder a las vistas de una forma muy sencilla, enlazando variables de nuestro código Kotlin o Java con los componentes del XML.

Esto se consigue gracias a que habilita la posibilidad de añade código dentro de los XMLs.

Gráfico de Data Binding extraído de code-labs.io
Gráfico de Data Binding extraído de code-labs.io

Esta solución es muy interesante, pero quizá demasiado invasiva para algunos desarrolladores, que ven cómo sus XMLs se empiezan a llenar de código. Bien usado es muy interesante, pero es muy fácil usarlo mal.

Además, se necesitan modificar los XMLs donde se usan, y aumenta los tiempos de compilación de forma sensible.

Pero hay un subconjunto de Data Binding que es muy sencillo de usar y que simplifica mucho la vida.

Se trata de unos objetos llamados Binding, que contenen todas las vistas del XML casteados al tipo correcto, además teniendo en cuental a posible nulidad de cada vista.

Esto simplifica mucho el trabajo, ya que en una sola línea podemos recuperar todas las vistas y tenerlas preparadas para su uso.

Con View Binding simplemente han extraído esta funcionalidad, la han optimizado en tiempo de compilación, y nos han ahorrado la necesidad de modificar el XML para poder usarlo.

En literalmente 2 líneas de código, tendrás tus XML listos para ser convertidos en objetos de binding.

Configuración de View Binding

Empezar a usar View Binding es tan sencillo como añadir una línea de código en el build.gradle

    android {
        viewBinding.enabled = true
    }

Cómo usar View Binding en una Activity

Lo único que necesitas es modificar la forma en que inflas la vista. En vez de llamar a setContentView con el identificador del layout, lo harás pasándole la vista que has inflado previamente con View Binding, de esta forma:

 val binding = ActivityMainBinding.inflate(layoutInflater)
 setContentView(binding.root)

binding.root contiene la raíz del layout que ha sido inflado previamente. Ya solo necesitas acceder a las properties del objeto para usar sus vistas:

binding.button.setOnClickListener {
    ...
}

¿Y cómo usarlo en un Adapter?

Aquí hay al menos un par de formas de hacerlo:

  • Usando el método inflate en el onCreateViewHolder y almacenando el objeto binding
  • Inflando de forma clásica el objeto y usando el método bind en el ViewHolder para tenerlo allí disponible.

A mí personalmente me gusta más la segunda forma, porque no hay que andar preocupándose de pasar el objeto de un punto a otro del adapter, sino que se crea justo donde se necesita.

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val v = parent.inflate(R.layout.view_media_item, false)
        return ViewHolder(
            v,
            listener
        )
    }

    class ViewHolder(view: View, private val listener: MediaListener) :
        RecyclerView.ViewHolder(view) {

        private val binding = ViewMediaItemBinding.bind(view)

    }

A partir de ese punto, ya se puede usar exactamente igual que lo hicimos en la Activity.

¿Por qué debería usarlo frente a otras alternativas?

La realidad es que el resto de opciones aún siguen siendo válidas, pero con matices.

ButterKnife, la más popular, a día de hoy está deprecada en favor de esta nueva librería.

Por otro lado, los synthetics son un poco más “oscuros”, ya que no tenemos mucho control sobre cómo funcionan, y además siempre dejan en manos del programador la decisión sobre la nulidad de cada vista. No asisten de ninguna forma en cuanto a esto.

Esta tabla está extraída del artículo en el blog de Android Developers:

View Binding : Comparación con otras alternativas

¿Debería entonces migrar todo mi código a View Binding?

Como comento en muchas ocasiones, que algo nuevo aparezca no quiere decir que debamos migrar todo nuestro código.

En este caso, al ser una funcionalidad tan ligera y fácil de integrar, no sería descabellado pensar en usarla en nuevas pantallas, e incluso refactorizar las que tengas que tocar por algún motivo.

En cualquier caso, como todo es opcional y solo debes hacerlo si te sientes cómodo con ello.

Conclusión

Espero que este artículo te haya servido para aclarar algunas dudas con respecto a View Binding, y que te animes a echarle uno ojo, porque puede simplificarte mucho el día a día.

Si quieres, puedes ver un código de ejemplo sobre View Binding en mi GitHub.

Además, he publicado un cheatsheet sobre View Binding en Instagram, por si quieres tener una chuleta a mano.

Para cualquier duda, ¡te leo en los comentarios!

Author: Antonio Leiva

Soy un apasionado de Kotlin. Hace ya más de dos años que estudio el lenguaje y su aplicación a Android para ayudarte a ti a aprenderlo de la forma más sencilla posible.