>

DataBinding (2) - Eventos, Includes y Observables

Francisco Manuel López Jurado     Colaboraciones    15/06/2018



En el anterior post ya vimos cómo pasar nuestro modelo al XML con el fin de eliminar la lógica de pintado / seteo de variables en las clases. En esta ocasión vamos a profundizar un poco más y veremos las demás ventajas y potencial que nos ofrece esta librería. Sin más, !vamos a ello!

Vinculando eventos de UI

Tenemos dos formas de manejar eventos:

Referencias a métodos

Los eventos pueden vincularse directamente con los métodos del manejador o controlador que los tenga, similar a la forma en que android:onClick asigna un método en una actividad pero aportando una ventaja: los fallos se verán en tiempo de compilación. Si definimos interfaces que no coinciden, el fallo lo veremos al compilar y no posteriormente (no funcione el click, crashes, etc). Los pasos que tenemos que seguir son:

  • Definimos nuestro método en la propia Activity o en una clase Handler aparte. Dicha definición será básica, por lo que sólo recibirá un parámetro de tipo View (ya que haremos el onClick).

  • Definimos la variable en el XML.

  • Establecemos el onClick siguiendo la siguiente nomenclatura: android:onClick=”@{NombreVariable::nombreMetodo}”

  • Establecemos valor en la variable “detailActivityHandler”.

Vinculando receptores

Mediante el uso de lambdas podemos establecer métodos que reciban parámetros más complejos y posteriormente capturar los eventos desde el XML. Los pasos a seguir son:

  • Definimos el método.

  • Definimos la variable en XML (como en el caso anterior de “Referencias a métodos”).
  • Hacemos uso de la expresión lambda para enviar el evento desde XML.

  • Establecemos valor en la variable “detailActivityHandler”. (Igual que en “Referencias a métodos” ).

Ya sea usando uno u otro, DataBinding proporciona un nexo de enlace entre nuestros eventos de UI y los métodos en las clases por lo que es una fuerte herramienta para ahorrar código de las vistas.

!Cuidado con lo que hacemos!

Sin embargo, esta forma de referenciar métodos debe usarse con cabeza y no incluir métodos muy complejos o con muchos parámetros ya que conseguiremos empeorar la lectura y comprensión de nuestro código de forma muy notable.

Comprobaciones con los nulos

Si queremos establecer un valor u otro en función de si nuestro objeto es nulo o no, podemos usar el operador ??”

Si “androidVersion.description” es null pintará lo que tenga definido en strings.xml en “detail__empty_description”.

Esta expresión es equivalente a:

Includes

Para poder pasar variables desde un XML a otro que tiene la etiqueta <include> es necesario hacer uso de la propiedad “bind:nombreDeLaVariable=@{nombreDeLaVariable}” y además, tienen que tener el mismo nombre en ambos XML.

Por ejemplo, tenemos la variable definida como “androidVersion” en nuestro XML llamado “activity_detail.xml” y en nuestro XML “view_description.xml” de tal forma:

Además, tenemos en “activity_detail.xml” también una etiqueta <include> incluyendo el layout “include_description.xml” que contiene un layout con un TextView donde pintaremos una propiedad de dicha variable.

Para que nos funcione, debemos hacer los siguientes pasos:

  • Dar un id a nuestra etiqueta include.
  • Establecer una propiedad llamada bind:androidVersion=@{androidVersion}
  • Ya podemos establecer en el TextView la propiedad que necesitemos de nuestra variable.

De tal forma nuestro include quedaría:

En cuanto a nuestro código en DetailActivity.kt

Y en nuestro XML include_description.xml:

Ejemplo con cambios de modelo (Observable)

Como ya comentamos en el post anterior, existe la posibilidad de vincular nuestro modelo a nuestra vista con la opción de que se actualice la UI automáticamente ante cambios en el mismo. Los pasos que hay que seguir para implementarlo son:

Importante: Nuestro código XML no sufrirá ningún cambio si nuestro modelo es Observable o no.

  • Nuestro modelo tiene que extender de Observable.

  • Para establecer los parámetros que tendrán la posibilidad de actualizarse automáticamente, los marcaremos con la anotación @Bindable. De esta forma estarán disponibles en nuestra clase autogenerada BR.
  • Para los parámetros que tengan dicha anotación, estableceremos un set y después de establecer el valor, llamaremos al método notifyPropertyChanged() y le pasaremos el id de la clase BR. De esta forma informaremos a la UI para que se actualice automáticamente sin que tengamos que ponerlo en nuestra Activity o Fragment repetitivamente.

  • Ahora simplemente estableceremos el valor de nuestro modelo y la UI se actualizará automáticamente.

Para el caso de que tengamos una lista observable simplemente debemos establecer el tipo a ObservableArrayList<AndroidVersionModel> y añadir o eliminar elementos a la misma.

No lo tiene todo… :,(

Existen una serie de propiedades que no podemos usar en nuestro XML con DataBinding, estas propiedades son:

  • this
  • super
  • new

En resumidas cuentas, DataBinding nos aporta otra herramienta para evitar mucho código repetitivo en las clases y que meramente es usado para actualizar valores, establecerlos, etc en la UI. Como siempre mantengo, se debe usar con cabeza y no abusar de esta potente librería que nos puede simplificar el desarrollo de UI de forma considerable. Espero que os haya gustado.


Sobre el autor

Francisco Manuel López Jurado   

Apasionado de la tecnología y todo lo que la rodea. Desarrollador Senior Android e iOS.