Kotlin Android Extensions: Adiós al findViewById (KDA 04)

A
Antonio Leiva
3 min lectura

Importante: desde Kotlin 1.4.20, las Kotlin Android Extensions están deprecadas, y la recomendación es usar ViewBinding en su lugar.

Hacia finales de 2021 el plugin será eliminado, así que es necesario migrar

Seguramente estés cansado en tu día a día de trabajar con findViewBy__Id para recuperar las vistas, o que ya te hayas dado por vencido y recurrido a la famosa librería Butterknife. Kotlin Android Extensions es mucho mejor que todo eso.

Si quieres empezar hoy, te recomiendo que le eches un vistazo a mi training gratuito, donde tendrás una hora y media de contenido para saber cuáles son tus siguientes pasos a dar para convertirte en un experto en Kotlin.

Training Revienta tu productividad en Android con Kotlin

Koltlin Android Extensions

Las Kotlin Android Extensions consisten en un nuevo plugin de Kotlin que se integra de manera totalmente transparente en nuestro código, y nos permiten recuperar las vistas de ActivitiesFragmentsViews de forma totalmente transparente.

1. Integrando Kotlin Android Extensions en nuestro código

Aunque el plugin viene integrado en el que ya nos descargamos de Kotlin, para poder utilizarlo necesitamos añadir un apply extra en nuestro proyecto:

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

Y esto es todo lo que necesitas, ya estás listo para trabajar con él

2. Recuperando las vistas en una activity o fragment

A partir de ese momento, es tan sencillo como utilizar el identificador que indicaste en el XML directamente en tu actividad o Fragment.

Supongamos que tenemos un XML como este:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/welcomeMessage"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Hello World!"/>

</FrameLayout>

Como ves, el TextView tiene el identificador welcomeMessage.

Tan sólo tienes que irte a la MainActivity y escribirlo:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    welcomeMessage.text = "Hello Kotlin!"
}

Para poder utilizarlo, necesitas un import especial, que es el que te pongo a continuación, pero el plugin de Kotlin es capaz de auto-importarlo. ¡No podría ser más sencillo!

import kotlinx.android.synthetic.main.activity_main.*

El código que esto genera por detrás será capaz de almacenar una caché de vistas, para que cada vez que se pida nuevamente no sea necesario hacer el findViewById real.

3. Recuperando vistas de una vista

Imagina que tienes una vista como esta:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
    
    <ImageView
        android:id="@+id/itemImage"
        android:layout_width="match_parent"
        android:layout_height="200dp"/>
    
    <TextView
        android:id="@+id/itemTitle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

Y que la estás inflando en un adapter, por ejemplo.

También puedes acceder directamente a sus subvistas sin necesidad de utilizar nada extra, tan solo usando este plugin:

val itemView = ...
itemView.itemImage.setImageResource(R.mipmap.ic_launcher)
itemView.itemTitle.text = "My Text"

Aunque el plugin también te ayudará a rellenar el import, este es un poco diferente del anterior:

import kotlinx.android.synthetic.main.view_item.view.*

Aquí hay un par de apuntes que hacer:

  1. En tiempo de compilación, te va a dejar acceder a cualquier vista desde cualquier otra. Es decir, podría no tener esas vistas como hijas. Pero en tiempo de ejecución, irá a buscarlas y no las encontrará, así que lanzará una excepción.

  2. Aquí no almacena una caché de vistas como con las Activities y los Fragments.

Pero usándolas con cabeza, son una herramienta muy poderosa

Conclusión

Ya has visto lo sencillo que es tratar con las vistas de Android en Kotlin. Con un simple plugin podemos olvidarnos de todas las complicaciones inherentes a la recuperación de las vistas desde un XML, ya que éste nos crea las properties con el tipo correcto sin más complicación.

Si te gusta lo que has visto, te animo a que te apuntes al training gratuito, donde te contaré todo lo que necesitas para aprender a crear tus Apps Android en Kotlin desde cero.