Anko: Androd + Kotlin

video[Tutorial Anko Android + Kotlin

Anko es una librería creada en Kotlin por JetBrains que tiene como propósito agilizar la creación de aplicaciones Android. Su nombre ha sido extraído de las dos primeras letras de Android y Kotlin -> Anko. Las características que nos ofrece pueden dividirse en cuatro módulos:

  •    Funciones comunes: Pequeñas funciones de ayuda para lanzar diálogos, intenciones, etc.
  •    Layouts: Creación rápida de layouts dinámicos desde código.
  •    SQLite: Colección de ayudantes para procesar consultas SQLite.
  •    Corutinas: utilidades basadas en la biblioteca kotlinx.coroutines.
En este capítulo nos centraremos en el primer módulo y mostraremos algún ejemplo de los siguientes[1].

Para añadir Anko a tu proyecto en build.gradle(Project) inserta:

buildscript {
    ext.ankoVersion = "0.10.8"
    … 

En build.gradle(Module) inserta la siguiente :

implementation "org.jetbrains.anko:anko:$ankoVersion" 
Si solo quieres utilizar algunas características puedes usar:
// Funciones comunes
implementation "org.jetbrains.anko:anko-commons:$anko_version"
// Layouts
implementation "org.jetbrains.anko:anko-sdk25:$anko_version" 
implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
// SQLite
implementation "org.jetbrains.anko:anko-sqlite:$anko_version"
// Corutinas
implementation "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"
implementation "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"
Si utilizas alguna librería de compatibilidad necesitarás:
    // Appcompat-v7 (solo Anko Funciones comunes)
implementation "org.jetbrains.anko:anko-appcompat-v7-commons:$anko_version"
    // Appcompat-v7 (Anko Layouts)
implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
implementation "org.jetbrains.anko:anko-coroutines:$anko_version"
    // CardView-v7
implementation "org.jetbrains.anko:anko-cardview-v7:$anko_version"
    // Design
implementation "org.jetbrains.anko:anko-design:$anko_version"
implementation "org.jetbrains.anko:anko-design-coroutines:$anko_version"
    // GridLayout-v7
implementation "org.jetbrains.anko:anko-gridlayout-v7:$anko_version"
    // Percent
implementation "org.jetbrains.anko:anko-percent:$anko_version"
    // RecyclerView-v7
implementation "org.jetbrains.anko:anko-recyclerview-v7:$anko_version"
implementation "org.jetbrains.anko:anko-recyclerview-v7-coroutines:$anko_version"
    // Support-v4 (solo Anko Funciones comunes)
implementation "org.jetbrains.anko:anko-support-v4-commons:$anko_version"
    // Support-v4 (Anko Layouts)
implementation "org.jetbrains.anko:anko-support-v4:$anko_version"
    // ConstraintLayout
implementation "org.jetbrains.anko:anko-constraint-layout:$anko_version" 

Funciones comunes

Este módulo de Anko incorpora una serie de funciones de extensión que simplifican la realización de algunas tareas comunes. Podemos:
Asignar un escuchador de eventos con un método abreviado:
 
sin Anko
boton.setOnClickListener { … } 
con Anko
boton.onClick { … } 
Arrancar una actividad con extras:
val intent = Intent(this, 
             Activid-ad::class.java)
intent.putExtra("id", 5)
intent.putExtra("nombre", "Juan")
startActivity(intent) 
startActivi-ty<Actividad>("id" to 5, 
                "nombre" to "Juan") 
Ejecutar las intenciones explícitas más comunes:
browse("http://androidcurso.com")
share("compartir", "asunto")
email("correo@upv.es", "asunto", "correo") 
Mostrar diálogos de alerta:
val builder = AlertDialog.Builder(this)
builder.setTitle("Titulo")
builder.setMessage("Mensaje")
builder.setPositiveButton("OK") {…}
build-er.setNegativeButton("Cancel"){…}
builder.show() 
alert(Appcompat,"Titulo","Mensaje") {
  positiveButton("OK") {…}
  negativeButton("Cancel") {…}
}.show() 
Mostrar un Toast:
Toast.makeText(this, "mensaje",    
   Toast.LENGTH_SHORT).show() 
toast("Mensaje") 
Mostrar diálogos Snackbar:
Snackbar.make(
  findViewBy-Id(android.R.id.content),
  "Mensaje", 
  Snackbar.LENGTH_LONG).show() 
longSnackbar(findViewById(
  android.R.id.content), "Men-saje") 
Obtener la ratio de conversión entre dp y píxeles:
val dpAsPx = TypedValue.applyDimension(
    TypedValue.COMPLEX_UNIT_DIP, 10f,
    getResources().getDisplayMetrics()) 
val dpAsPx = dip(10f) 
Escribir código condicional según la versión de SDK:
if (Build.VERSION.SDK_INT == 
   Build.VERSION_CODES.LOLLIPOP){…}
if (Build.VERSION.SDK_INT >= 
   Build.VERSION_CODES.LOLLIPOP){…} 
doIfSdk(Build.VERSION_CODES.LOLLIPOP){…}

do-FromSdk(Build.VERSION_CODES.LOLLIPOP){} 
Ejecutar código en otros hilos:
Thread {
  run() {
    runOnUiThread {
      toast("ejecut. desde otro hilo")
    }
  }
}.start() 
doAsync {
  uiThread {
    toast("ejecutado desde otro hilo")
  }
} 
El código de la derecha no sería 100% equivalente, dado que se basa en la clase Executor en lugar de Thread.

Layouts

Este módulo de Anko permite insertar layouts por código en tiempo de ejecu-ción, en lugar de diseñarlos en XML:
setContentView(R.layout.activity_main)
verticalLayout {
    val nombre = editText()
    button("Escribe tu nombre") {
        onClick { toast("Hola, ${nombre.text}!") }
    }
} 
Más info: https://medium.com/@v.souhrada/introduction-to-anko-for-android-part-1-6178d536cbe6
desafio

Desafío: Usar Anko para crear un layout.

Trata de crear un layout de Audiolibros utilizando Anko en lugar del diseño en XML.

[1] https://www.kotlindevelopment.com/why-should-use-anko/