Simplificar el desarrollo de aplicaciones de Android con Anko

Diseñada por JetBrains, la organización detrás de Kotlin, Anko es una biblioteca de código abierto que puede cambiar radicalmente la forma en que creas las aplicaciones de Android. Aprovecha la sintaxis de Kotlin para ofrecer una gran colección de funciones de ayuda que le ayudan a reducir la verbosidad de su código al tiempo que mejora su rendimiento..

Anko se dobla como un DSL, abreviatura de lenguaje específico del dominio, para crear diseños de Android. En otras palabras, puede actuar como una alternativa segura al tipo, dinámica y más reutilizable a los archivos XML de diseño, que, como ya sabrá, tienden a ser difíciles de manejar para aplicaciones grandes.

En este tutorial, te ayudaré a comenzar con Anko mostrándote cómo usar algunas de sus funciones más populares.

1. Configuración del proyecto

Para poder usar las funciones principales de Anko en su proyecto de Android Studio, todo lo que necesita hacer es agregar lo siguiente implementación dependencia en el aplicación módulo de construir.gradle expediente:

implementación 'org.jetbrains.anko: anko: 0.10.1'

Sin embargo, si desea que Anko funcione con widgets de las bibliotecas de soporte de Android, necesitará las siguientes dependencias adicionales:

implementación 'org.jetbrains.anko: anko-appcompat-v7: 0.10.1' implementación 'org.jetbrains.anko: anko-design: 0.10.1' implementación 'org.jetbrains.anko: anko-recyclerview-v7: 0.10. 1 'implementación' org.jetbrains.anko: anko-cardview-v7: 0.10.1 '

2. Creando Diseños

Anko DSL tiene funciones de ayuda para casi todos los widgets que ofrece el SDK de Android y las bibliotecas de soporte de Android. Usándolos, puedes crear tus diseños programáticamente. Los nombres de las funciones coinciden con los nombres de los widgets, pero comienzan con una letra minúscula. Por ejemplo, para crear un Vista de texto widget, usas Anko's vista de texto() función. Del mismo modo, para crear un Botón de acción flotante widget, puede utilizar el Botón de acción flotante () función.

Dentro de las funciones, tendrá acceso a todas las propiedades y escuchas de eventos de los widgets asociados. Por ejemplo, puede cambiar el tamaño de texto de un Vista de texto widget mediante la actualización del valor de la tamano del texto propiedad dentro del vista de texto() función. Del mismo modo, puede agregar un detector de eventos al hacer clic con el botón al hacer clic método.

Para ayudarlo a comprender mejor cómo usar el DSL, aquí hay un diseño de muestra para una aplicación de navegador, que contiene un Editar texto widget y un WebView widget colocado dentro de un LinearLayout widget cuya orientación es VERTICAL:

linearLayout orientación = LinearLayout.VERTICAL var myWebView: ¿WebView? = nulo editText inputType = InputType.TYPE_TEXT_VARIATION_URI imeOptions = EditorInfo.

El código escrito en el Anko DSL es muy legible e intuitivo, pero requiere cierto tiempo para acostumbrarse, especialmente si ya eres un desarrollador de Android con experiencia. Ya no tiene que asignar identificadores a sus widgets, o usar el findViewById () método para hacer referencia a ellos, porque a diferencia de los diseños basados ​​en XML, los diseños basados ​​en DSL de Anko pueden encapsular la lógica empresarial de su aplicación. Por ejemplo, puedes ver que el Editar texto widget definido anteriormente tiene una OnEditorAction detector de eventos que llama directamente al loadUrl () método de la WebView Widget para cargar la URL que el usuario escribió..

Además, no tienes que llamar al setContentView () Método más porque Anko lo llama automáticamente dentro de su Actividad clase onCreate () método.

El DSL incluye varios accesos directos que puede utilizar para hacer sus diseños más concisos. Por ejemplo, puede pasar directamente cadenas a sus funciones para asignar etiquetas a los widgets. A menudo, también puede evitar establecer explícitamente parámetros de diseño como anchos y alturas porque los maneja automáticamente. El siguiente código de ejemplo le muestra cómo crear un diseño que contiene dos Vista de texto widgets de una manera muy concisa:

verticalLayout textView ("One") textView ("Two")

A modo de comparación, esto es cómo se vería el diseño anterior si se creara de manera convencional:

    

Por último, vale la pena mencionar que los diseños creados con el DSL de Anko tienden a cargarse más rápido que los diseños normales porque no se requiere un análisis de XML..

3. Creando diálogos

Si crees que usar el AlertDialog.Builder La clase para crear diálogos es mucho trabajo, definitivamente no estás solo. Por ejemplo, aquí es cómo normalmente crearía un cuadro de diálogo simple que muestra un título, un mensaje y un botón "Aceptar":

AlertDialog.Builder (este @ MyActivity) .setTitle ("My Dialog") .setMessage ("Este es un mensaje de prueba") .setPositiveButton ("OK", null) .create () .show ()

Sin embargo, con Anko, crear el diálogo anterior simplemente implica una llamada al alerta() Función, que acepta el título y el mensaje del diálogo como sus argumentos..

alerta ("Este es un mensaje de prueba", "Mi cuadro de diálogo") yesButton  .show ()

Tenga en cuenta que no tiene que pasar un contexto a la alerta() función. Infiere el contexto automáticamente..

Anko tiene funciones similares con nombres intuitivos para ayudarlo a crear rápidamente brindis y barras de refrigerios también. El siguiente código le muestra cómo crear brindis de corta y larga duración:

tostada ("Esta es una tostada corta") longToast ("Y esta es una tostada larga")

4. Crear intenciones

Siempre que necesite iniciar una nueva actividad en su aplicación, debe crear una intención. Además, si desea enviar datos a la actividad, debe incluirlos en la intención como uno o más extras. 

Con anko startActivity () función, normalmente puede realizar ambas tareas en una sola línea de código. Por ejemplo, el siguiente código le muestra cómo iniciar una actividad llamada Mi actividad y pase dos extras, una cadena extra llamada "PERSONA" y un entero extra llamado "EDAD", a esto:

startActivity("PERSONA" a "Bob", "EDAD" a 25)

Anko también tiene funciones de ayuda para varias tareas comunes basadas en intenciones. Por ejemplo, puedes usar su vistazo() Función para abrir una URL en la aplicación de navegador predeterminada del dispositivo. Del mismo modo, puede utilizar el correo electrónico() Función para abrir la aplicación de correo electrónico predeterminada y redactar un correo electrónico..

// Abrir navegador navegar ("https://tutsplus.com") // Abrir correo electrónico predeterminado de la aplicación de correo electrónico ("[email protected]", "Hola", "Este es un correo electrónico de prueba")

5. Uso de bases de datos SQLite

Aunque todas las aplicaciones de Android pueden crear y usar bases de datos SQLite sin dependencias adicionales, muchos desarrolladores eligen bases de datos de terceros como Realm. ¿Por qué? Bueno, tal vez sea porque la API SQLite de Android es extremadamente detallada, de bajo nivel y requiere una buena comprensión de SQL. Afortunadamente, Anko tiene funciones de ayuda de SQLite para resolver todos esos problemas..

Digamos que tenemos una base de datos SQLite simple creada con el siguiente código:

val myDB = openOrCreateDatabase ("test.db", Context.MODE_PRIVATE, null)

Con Anko, ahora puede agregar una tabla a la base de datos anterior simplemente usando el crear mesa() función, que espera el nombre de la tabla junto con uno más o tuplas que especifican los nombres y tipos de datos de sus columnas. El siguiente código de ejemplo crea una tabla llamada PERSONA que tiene cuatro columnas, una de las cuales sirve como clave principal:

myDB.createTable ("PERSONA", verdadero, "NOMBRE" a TEXTO, "EDAD" a INTEGER, "NET_WORTH" a REAL, "ID" a INTEGER + PRIMARY_KEY)

Además, para insertar filas en la tabla, ya no tiene que depender de la Valores de contenido () clase. Puede llamar directamente al insertar() función en la base de datos, especifique el nombre de la tabla a la que desea agregar la fila y, luego, pásele los valores de columna en forma de tuplas.

// Agregue una fila myDB.insert ("PERSONA", "NOMBRE" a "Bob Martin", "EDAD" a 25, "NET_WORTH" a 2500.50, "ID" a 100) // Agregue otra fila myDB.insert (" PERSONA "," NOMBRE "a" Jane Flores "," EDAD "a 32," NET_WORTH "a 21500.80," ID "a 101)

Por último, para consultar la base de datos, puede utilizar el seleccionar() función, seguida opcionalmente por una cadena de funciones nombradas intuitivamente, tales como dondeSimple (), orderBy (), y agrupar por(). Por ejemplo, para enumerar los nombres y edades de todas las personas en la tabla anterior cuyo valor neto es mayor que 10000, Puedes usar el siguiente código:

myDB.select ("PERSON", "NAME", "AGE") .whereSimple ("NET_WORTH>?", "10000.0"). exec // Más código aquí

El resultado de la consulta anterior será, como cabría esperar, un Cursor objeto. Convertirlo en un Lista que contenga valores de columna reales de todas las filas es un poco más complicado porque implica la creación de un objeto que implementa el RowParser Interfaz y pasándolo a la parseList () función.

los RowParser interfaz tiene un solo método, el parseRow () Método, dentro del cual tendrás acceso a los valores de columna de una fila. Cómo usas los valores, por supuesto, depende de ti. Por ahora, solo concatenemos e imprimamos. El siguiente código le muestra cómo hacerlo:

parseList (objeto: RowParseranular la diversión parseRow (columnas: Array): Cadena // Concatenar los valores de la primera y la segunda columnas, // que son NAME y AGE devuelven "$ columnas [0] ($ columnas [1] años)"). forEach println (it) // imprime los valores concatenados // El resultado es: // Jane Flores (32 años)

Tenga en cuenta que no siempre tiene que crear un RowParser Objeto manualmente. Si los resultados de su consulta contienen solo una columna, puede utilizar uno de los muchos analizadores integrados de Anko. 

Los nombres de los analizadores integrados se basan en los tipos de datos de las columnas. Por ejemplo, si el tipo de datos es TEXTO, puedes usar un StringParser. O si el tipo de datos es ENTERO, puedes usar un IntParser. El siguiente código le muestra cómo usar un StringParser para simplemente listar los nombres de todas las personas en nuestra base de datos:

myDB.select ("PERSON", "NAME"). exec parseList (StringParser) .forEach println (it) // El resultado es: // Bob Martin // Jane Flores

Conclusión

En este tutorial, aprendiste a usar las funciones de ayuda y DSL de Anko para simplificar el desarrollo de aplicaciones de Android. También viste cómo Anko simplifica las operaciones relacionadas con SQLite. Espero que ahora se den cuenta de lo bien pensada y útil que es la biblioteca..

En mi opinión, si ya eres competente en Kotlin, realmente no hay razón por la que no debas usar Anko para mejorar aún más tu eficiencia y experiencia de desarrollo. Para aprender más sobre esto, refiérase a su wiki oficial.

Y mientras estás aquí, echa un vistazo a algunas de nuestras otras publicaciones sobre el desarrollo de aplicaciones Kotlin y Android!