Simplifiez le développement d'applications Android avec Anko

Conçu par JetBrains, l'organisation derrière Kotlin, Anko est une bibliothèque open source qui peut radicalement changer la façon dont vous créez des applications Android. Il utilise la syntaxe de Kotlin pour offrir une vaste collection de fonctions d’aide qui vous aident à réduire la verbosité de votre code tout en améliorant ses performances..

Anko fait également office de DSL, abréviation de langage spécifique à un domaine, permettant de créer des mises en page Android. En d'autres termes, il peut constituer une alternative sécurisée contre le texte, dynamique et plus réutilisable aux fichiers XML de mise en page, qui, comme vous le savez peut-être déjà, ont tendance à devenir difficile à manier pour les applications volumineuses..

Dans ce tutoriel, je vais vous aider à démarrer avec Anko en vous montrant comment utiliser certaines des fonctionnalités les plus populaires..

1. Configuration du projet

Pour pouvoir utiliser les principales fonctionnalités d’Anko dans votre projet Android Studio, il vous suffit d’ajouter les éléments suivants: la mise en oeuvre dépendance dans le app modules build.gradle fichier:

implémentation 'org.jetbrains.anko: anko: 0.10.1'

Si vous voulez qu'Anko fonctionne avec des widgets des bibliothèques de support d'Android, vous aurez besoin des dépendances supplémentaires suivantes:

implémentation 'org.jetbrains.anko: anko-appcompat-v7: 0.10.1' implémentation 'org.jetbrains.anko: anko-design: 0.10.1' implémentation 'org.jetbrains.anko: anko-recyclerview-v7: 0.10. 1 'implémentation' org.jetbrains.anko: anko-cardview-v7: 0.10.1 '

2. Créer des mises en page

Anko DSL possède des fonctions d'assistance pour presque tous les widgets proposés par le SDK Android et les bibliothèques de support Android. En les utilisant, vous pouvez créer vos mises en page par programmation. Les noms des fonctions correspondent aux noms des widgets, mais ils commencent par une lettre minuscule. Par exemple, pour créer un Affichage widget, vous utilisez Anko affichage() une fonction. De même, pour créer un FloatingActionButton widget, vous pouvez utiliser le floatingActionButton () une fonction.

Dans les fonctions, vous aurez accès à toutes les propriétés et aux écouteurs d'événements des widgets associés. Par exemple, vous pouvez modifier la taille du texte d’un Affichage widget en mettant à jour la valeur de la taille du texte propriété à l'intérieur du affichage() une fonction. De la même façon, vous pouvez lui ajouter un écouteur d’événements sur clic en utilisant le bouton sur clic méthode.

Pour vous aider à mieux comprendre comment utiliser la DSL, voici un exemple de mise en page pour une application de navigateur, contenant un Éditer le texte widget et un WebView widget placé à l'intérieur d'un LinearLayout widget dont l'orientation est VERTICALE:

linearLayout orientation = LinearLayout.VERTICAL var myWebView: WebView? = null editText inputType = InputType.TYPE_TEXT_VARIATION_URI imeOptions = EditorInfo.IME_ACTION_GO onEditorAction _, _, _ -> myWebView? .loadUrl (text.toString ()) myWebView = webView webViewClient = WebViewClient)

Le code écrit dans Anko DSL est très lisible et intuitif, mais il faut s’y habituer, surtout si vous êtes déjà un développeur Android expérimenté. Vous n'avez plus besoin d'attribuer d'identifiants à vos widgets, ni d'utiliser le findViewById () méthode de référence, car contrairement aux dispositions basées sur XML, les dispositions basées sur DSL d’Anko peuvent encapsuler la logique commerciale de votre application. Par exemple, vous pouvez voir que le Éditer le texte Le widget défini ci-dessus a un OnEditorAction écouteur d'événements qui appelle directement le loadUrl () méthode du WebView widget pour charger l'URL saisie par l'utilisateur.

De plus, vous n’avez pas à appeler le setContentView () méthode plus parce que Anko l'appelle automatiquement à l'intérieur de votre Activité la classe onCreate () méthode.

Le DSL comprend plusieurs raccourcis que vous pouvez utiliser pour rendre vos mises en page plus concises. Par exemple, vous pouvez directement passer des chaînes à ses fonctions pour attribuer des étiquettes aux widgets. Souvent, vous pouvez également éviter de définir explicitement des paramètres de mise en page tels que les largeurs et les hauteurs, car ils les gèrent automatiquement. Le code exemple suivant vous montre comment créer une mise en page contenant deux Affichage widgets de manière très concise:

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

À titre de comparaison, voici à quoi ressemblerait la mise en page ci-dessus si elle était créée de manière conventionnelle:

    

Enfin, il convient de noter que les mises en page créées à l'aide d'Anko DSL ont tendance à se charger plus rapidement que les mises en page habituelles, car aucune analyse XML n'est requise..

3. Créer des dialogues

Si vous pensez utiliser le AlertDialog.Builder La classe pour créer des dialogues représente beaucoup de travail, vous n'êtes certainement pas seul. Par exemple, voici comment vous créeriez normalement une simple boîte de dialogue qui affiche un titre, un message et un bouton "OK":

AlertDialog.Builder (this @ MyActivity) .setTitle ("Mon dialogue") .setMessage ("Ceci est un message de test") .setPositiveButton ("OK", null) .create () .show ()

Avec Anko, cependant, créer la boîte de dialogue ci-dessus implique simplement un appel à la alerte() fonction qui accepte le titre et le message du dialogue comme arguments.

alert ("Ceci est un message de test", "Mon dialogue") yesButton  .show ()

Notez que vous n’avez pas besoin de passer un contexte à la alerte() une fonction. Il infère le contexte automatiquement.

Anko a des fonctions similaires nommées intuitivement pour vous aider à créer rapidement des toasts et des barres snack. Le code suivant vous montre comment créer des toasts de courte et de longue durée:

toast ("ceci est un toast court") longToast ("et ceci est un toast long")

4. Créer des intentions

Chaque fois que vous devez démarrer une nouvelle activité dans votre application, vous devez créer une intention. De plus, si vous souhaitez envoyer des données à l'activité, vous devez les inclure dans l'intention sous la forme d'un ou de plusieurs extras.. 

Avec Anko startActivity () fonction, vous pouvez généralement exécuter les deux tâches dans une seule ligne de code. Par exemple, le code suivant vous montre comment lancer une activité nommée Mon activité et transmettez-lui deux extras, une chaîne supplémentaire nommée "PERSONNE" et un entier supplémentaire nommé "AGE":

startActivity("PERSONNE" à "Bob", "ÂGE" à 25 ans)

Anko dispose également de fonctions d'assistance pour plusieurs tâches communes basées sur une intention. Par exemple, vous pouvez utiliser ses Feuilleter() fonction pour ouvrir une URL dans l'application de navigateur par défaut du périphérique. De même, vous pouvez utiliser le email() fonction pour ouvrir l'application de messagerie par défaut et composer un email.

// Ouvrir le navigateur parcourir ("https://tutsplus.com") // Ouvrir l'adresse de messagerie de l'application de messagerie par défaut ("[email protected]", "Bonjour", "Ceci est un e-mail de test")

5. Utilisation des bases de données SQLite

Même si chaque application Android peut créer et utiliser des bases de données SQLite sans dépendances supplémentaires, de nombreux développeurs choisissent des bases de données tierces telles que Realm. Pourquoi? Eh bien, c'est peut-être parce que l'API SQLite d'Android est extrêmement détaillée, de bas niveau et nécessite une bonne compréhension de SQL. Heureusement, Anko dispose de fonctions d'assistance SQLite pour résoudre tous ces problèmes..

Supposons que nous ayons une base de données SQLite simple créée à l'aide du code suivant:

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

Avec Anko, vous pouvez maintenant ajouter une table à la base de données ci-dessus simplement en utilisant le createTable () function, qui attend le nom de la table avec un ou plusieurs tuples spécifiant les noms et les types de données de ses colonnes. L'exemple de code suivant crée une table nommée LA PERSONNE ayant quatre colonnes, dont l'une sert de clé primaire:

myDB.createTable ("PERSON", true, "NAME" en TEXT, "AGE" en INTEGER, "NET_WORTH" en REAL, "ID" en INTEGER + PRIMARY_KEY)

De plus, pour insérer des lignes dans la table, vous ne devez plus dépendre de la ContentValues ​​() classe. Vous pouvez appeler directement le insérer() fonction sur la base de données, spécifiez le nom de la table à laquelle vous souhaitez ajouter la ligne, puis transmettez-lui les valeurs de colonne sous la forme de tuples.

// Ajoute une ligne myDB.insert ("PERSON", "NOM" à "Bob Martin", "AGE" à 25 ans, "NET_WORTH" à 2500.50, "ID" à 100) // Ajoute une autre ligne myDB.insert (" PERSONNE "," NOM "à" Jane Flores "," AGE "à 32 ans," NET_WORTH "à 21500.80," ID "à 101)

Enfin, pour interroger la base de données, vous pouvez utiliser le sélectionner() fonction, éventuellement suivie d’une chaîne de fonctions nommées de manière intuitive telles que oùSimple (), commandé par(), et par groupe(). Par exemple, pour répertorier dans le tableau ci-dessus les noms et les âges de toutes les personnes dont la valeur nette est supérieure à 10000, vous pouvez utiliser le code suivant:

myDB.select ("PERSON", "NAME", "AGE") .whereSimple ("NET_WORTH>?", "10000.0"). exec // Plus de code ici

Le résultat de la requête ci-dessus sera, comme vous vous en doutez, un Le curseur objet. La convertir en un liste contenant les valeurs de colonne réelles de toutes les lignes est légèrement plus compliqué car il implique la création d'un objet qui implémente le RowParser interface et en le passant à la parseList () une fonction.

le RowParser l'interface n'a qu'une méthode, la parseRow () méthode, à l'intérieur de laquelle vous aurez accès aux valeurs de colonne d'une ligne. Comment vous utilisez les valeurs est bien sûr à vous. Pour l'instant, concaténons-les et imprimons-les. Le code suivant vous montre comment procéder:

parseList (objet: RowParserredéfinit fun parseRow (columns: Array): String // Concaténer les valeurs des première et deuxième colonnes, // qui sont NAME et AGE retournent "$ colonnes [0] ($ colonnes [1] années)"). forEach println (it) // affiche les valeurs concaténées // le résultat est: // Jane Flores (32 ans)

Notez que vous ne devez pas toujours créer un RowParser objet manuellement. Si les résultats de votre requête ne contiennent qu'une colonne, vous êtes libre d'utiliser l'un des nombreux analyseurs intégrés d'Anko.. 

Les noms des analyseurs intégrés sont basés sur les types de données des colonnes. Par exemple, si le type de données est TEXTE, vous pouvez utiliser un StringParser. Ou si le type de données est ENTIER, vous pouvez utiliser un IntParser. Le code suivant vous montre comment utiliser un StringParser pour lister simplement les noms de toutes les personnes dans notre base de données:

myDB.select ("PERSON", "NAME"). exec parseList (StringParser) .forEach println (it) // le résultat est: // Bob Martin // Jane Flores

Conclusion

Dans ce tutoriel, vous avez appris à utiliser les fonctions d'assistance DSL et d'assistance d'Anko pour simplifier le développement d'applications Android. Vous avez également vu comment Anko simplifie les opérations liées à SQLite. J'espère que vous réalisez maintenant à quel point la bibliothèque est bien pensée et utile.

À mon avis, si vous êtes déjà compétent dans Kotlin, il n'y a vraiment aucune raison pour que vous n'utilisiez pas Anko pour améliorer davantage votre efficacité et votre expérience de développement. Pour en savoir plus, consultez son wiki officiel..

Et pendant que vous êtes ici, consultez nos autres articles sur le développement d'applications Kotlin et Android.!