Extensiones de Kotlin para Android

Si llevas algún tiempo desarrollando aplicaciones Android, probablemente ya estés cansado de trabajar con findViewById en tu día a día para recuperar vistas. O tal vez te rendiste y comenzaste a usar la famosa biblioteca Butterknife. Si ese es tu caso, entonces te encantará Kotlin Android Extensions. Kotlin tiene una inyección de vista incorporada para Android, lo que permite omitir el enlace manual o la necesidad de marcos como ButterKnife. Algunas de las ventajas son una sintaxis más agradable, mejor escritura estática y, por lo tanto, menos propenso a errores. En su proyecto local (no de nivel superior) build.gradle agregue la declaración del complemento de extensiones debajo de su complemento Kotlin, en el nivel de sangría de nivel superior.

buildscript {
...
}
id : "com.android.application"
...
id: "kotlin-android"
id "kotlin-android-extensions"
...

Uso de vistas

Suponiendo que tenemos una actividad con un diseño de ejemplo llamado activity_main.xml:

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/my_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="My button"/>
</LinearLayout>

Podemos usar las extensiones de Kotlin para llamar al botón sin ningún enlace adicional como este:

Kotlin

import kotlinx.android.synthetic.main.activity_main.my_button
 
class MainActivity: Activity() {
  override fun onCreate(savedInstanceBundle: Bundle?) {
    super.onCreate(savedInstanceBundle)
    setContentView(R.layout.activity_main)
    // my_button is already casted
    // to a proper type of "Button"
    // instead of being a "View"
    my_button.setText("Kotlin rocks!")
   }
}

También puede importar todos los ID que aparecen en el diseño con una notación *

// my_button se puede usar de la misma manera que antes

importar kotlinx.android.synthetic.main.activity_main.*

Las vistas sintéticas no se pueden usar fuera de Actividades/Fragmentos/Vistas con ese diseño inflado:

Kotlin

import kotlinx.android.synthetic.main.activity_main.my_button
 
class NotAView {
  init {
    // This sample won't compile!
    my_button.setText("Kotlin rocks!")
  }
}

sabores del producto

Las extensiones de Android también funcionan con múltiples sabores de productos de Android. Por ejemplo, si tenemos sabores en build.gradle así:

android {
  productFlavors {
    paid {
    ...
    }
    free {
    ...
    }
  }
}

Y, por ejemplo, solo el sabor gratuito tiene un botón de compra:

XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <Button
    android:id="@+id/buy_button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Buy full version"/>
</LinearLayout>

Podemos unirnos al sabor específicamente:

importar kotlinx.android.synthetic.free.main_activity.buy_button

Oyente doloroso por hacerse notar, cuando la vista está completamente dibujada ahora es tan simple e impresionante con la extensión de Kotlin

mView.afterMeasured {
// inside this block the view is completely drawn
// you can get view's height/width, it.height / it.width
}

Bajo el capó

Kotlin

inline fun View.afterMeasured(crossinline f: View.() -> Unit) {
  viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
     if (measuredHeight > 0 && measuredWidth > 0) {
       viewTreeObserver.removeOnGlobalLayoutListener(this)
       f()
     }
   }
 })
}

Publicación traducida automáticamente

Artículo escrito por eralokyadav2019 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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