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.
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 Activities, Fragments y Views 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:
- 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.
- 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.
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.
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.
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.
Me alegro!
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/
No, ahora la recomendación es usar ViewBinding, findViewById no creo que vuelva 😄
https://devexperto.com/view-binding/