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

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 findViewById 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.

Quizá también te interese…

Kotlin 1.5.0 : Las 5 novedades que puedes empezar a usar hoy

Kotlin 1.5.0 : Las 5 novedades que puedes empezar a usar hoy

Kotlin 1.5.0 ya está aquí, y como siempre trae una serie de novedades que te van a interesar muchísimo. Cabe destacar que a partir de ahora, de acuerdo las nuevas versiones de Kotlin se lanzarán cada 6 meses, independientemente de las nuevas funcionalidades que...

¿Qué es Kotlin y para qué sirve?

¿Qué es Kotlin y para qué sirve?

Kotlin es un lenguaje de programación de código abierto creado por JetBrains que se ha popularizado gracias a que se puede utilizar para programar aplicaciones Android. Pero si has llegado hasta aquí pensando que Kotlin solo se puede usar en Android, lo que te voy a...

2 formas de recolectar Flows en la UI que SÍ funcionan

2 formas de recolectar Flows en la UI que SÍ funcionan

En la serie de artículos sobre Programación Reactiva con Flow hemos visto muchos conceptos, y hemos aprendido cómo aplicarlos al desarrollo Android. Pero hay algo que no hemos hecho del todo bien. Esto es la recolección de Flows desde la Activity (o el Fragment, en...

6 Comentarios

  1. Chema

    Hola,

    muy interesante tu publicación. Tengo una pregunta sobre algo que no me ha terminado de quedar claro.

    Como bien explicas, con las kotlin android extensions nos ahorramos el findViewById, pero a la hora de utilizarlo, ¿seguiría siendo recomendable declararnos una variable en la que guardarnos la View?

    Es decir, supongamos que tenemos un textView en el layout con id tvTitulo, para trabajar con ella:

    ¿Hacemos esto?

    tvTitulo.text = “Hola”
    tvTitulo.text = “Bienvenido”
    tvTitulo.text = “Qué tal”

    ¿O hacemos esto?

    mTitulo = tvTitulo

    mTitulo .text = “Hola”
    mTitulo .text = “Bienvenido”
    mTitulo .text = “Qué tal”

    Salu2.

    Responder
    • Antonio Leiva

      No, en general no hace falta guardarlo en una variable, si lo hacemos en una activity o un fragment. En un adapter (cuando usamos synthetic con “.view”) sí que es mejor porque cada vez se usa por detrás el findViewById.

      Responder
  2. Luis Angel

    Muchas gracias! Realmente está información me resuelve dudas de soluciones que había visto en todas partes y no sabía de donde salían los campos.

    Responder
  3. Mark

    NO MAS…. con Kotlin 1.4.20 y en los sucesivos

    de nuevo saluda el FindViewById acaban de hacer obsoleto el
    kotlinx.android.synthetics

    resumen:

    Deprecation of Kotlin Android Extensions

    Ever since we created Kotlin Android Extensions, they have played a huge role in the growth of Kotlin’s popularity in the Android ecosystem. With these extensions, we provided developers with convenient and efficient tools for reducing boilerplate code:

    Synthetic views (kotlinx.android.synthetics) for UI interaction.
    Parcelable implementation generator (@Parcelize) for passing objects around as Parcel‘s.

    Initially, we thought about adding more components to kotlin-android-extensions. But this didn’t happen, and we’ve even received user requests to split the plugin into independent parts.

    On the other hand, the Android ecosystem is always evolving, and developers are getting new tools that make their work easier. Some gaps that Kotlin Android Extensions were filling have now been covered by native mechanisms from Google. For example, regarding the concise syntax for UI interaction, there is now Android Jetpack, which has view binding that replaces findViewById, just like Kotlin synthetics.

    Given these two factors, we’ve decided to retire synthetics in favor of view binding and move the Parcelable implementation generator to a separate plugin.

    In 1.4.20, we’ve extracted the Parcelable implementations generator from kotlin-android-extensions and started the deprecation cycle for the rest of it, which currently is only synthetics. For now, they will continue to work with a deprecation warning. In the future, you’ll need to switch your project to another solution. Here are the guidelines for migrating Android projects from synthetics to view bindings.

    The Parcelable implementation generator is now available in the new kotlin-parcelize plugin. Apply this plugin instead of kotlin-android-extensions. The @Parcelize annotation is moved to the kotlinx.parcelize package. Note that kotlin-parcelize and kotlin-android-extensions can’t be applied together in one module.

    fuente aca
    https://blog.jetbrains.com/kotlin/2020/11/kotlin-1-4-20-released/

    Responder

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de Antonio Leiva Gordillo, con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *