Android Kotlin

Ce tutoriel explique comment ajouter la bibliothèque Anko, plus précisément Anko Commons, dans un projet Android Studio, d’ores et déjà configuré avec Kotlin (cf. Configurer Kotlin dans un projet Android Studio [AK 2]). En outre, il est possible d’ajouter les extensions Kotlin afin d’accéder facilement aux éléments des vues XML (cf. AK-3).

De plus, ce tutoriel introduit quelques fonctionnalités astucieuses disponibles dans la bibliothèque Anko Commons, telles que :

La bibliothèque Anko, écrite en Kotlin, contient en fait 4 sous bibliothèques [1] :

  • Anko Commons : contient des outils pour les développements Android récurrents (Intents, Dialogs, Log, etc.)
  • Anko Layouts : pour coder des vues dynamiquement
  • Anko SQLite : pour travailler avec Android SQLite
  • Anko Coroutines: basée sur la bibliothèque kotlinx.coroutines

Anko Commons est la bibliothèque incontournable pour le développement d’application mobile Android avec le langage Kotlin !

Importer la bibliothèque Anko Commons

  1. Placez vous dans le fichier gradle du projet build.gradle (Project: MyProject)
  2. Ajoutez une variable contenant la version d’Anko Commons à utiliser :

     ext.anko_version = '0.10.0'
    
  3. Placez vous dans le fichier gradle du module build.gradle (Module: app)
  4. Ajoutez la dépendance Anko Commons dans le bloc approprié dependencies :

avec AS 2

    dependencies {
      ...
      compile "org.jetbrains.anko:anko-common:$anko_version"
    }

avec AS 3

    dependencies {
      ...
      implementation "org.jetbrains.anko:anko-common:$anko_version"
    }

À présent, nous allons voir les principales facilitées de développement Android apportées par cette bibliothèque.

Afficher un message d’erreur

Afin d’afficher des messages dans la console du développeur, soit dans la console Android Monitor, le SDK Android fournit la classe Log (cf. documentation officiel). Son utilisation est quelque peu fastidieuse. En effet, les méthodes à utiliser (Log.i(), Log.e(), etc.) prennent 2 paramètres :

  • un TAG, une chaine de caractères comprenant le nom de la classe courante
  • le message à afficher dans la console

En revanche, avec l’interface AnkoLogger, dont l’import correspond à import org.jetbrains.anko.AnkoLogger, seul un paramètre est nécessaire [2].

Voici un exemple d’utilisation depuis une Activity :

  1. Déclarez l’interface AnkoLogger :

     class MyActivity : Activity(), AnkoLogger {
         ...
     }
    
  2. Affichez un message d’information :

     info("Kotlin is an island")
    

Avec le SDK Android, cela revient à utiliser la classe Log dont l’import correspond à import android.util.Log :

 Log.i(MyActivity::class.java.simpleName, "Kotlin is an island")

Afficher un message rapide

Afin de présenter des messages d’information rapide à l’utilisateur, le SDK Android fournit la classe Toast (cf. documentation officiel). Elle permet de créer un message avec makeText(), cette dernière prend 3 paramètres :

  • le contexte de l’application (this depuis une Activity, activity depuis un Fragment)
  • le message
  • la durée d’affichage long ou court

Enfin, il s’agit d’afficher le message ainsi créé via la fonction show() (l’appel indispensable à ne pas oublier lorsqu’on code à la plage ;).

La bibliothèque Anko Commons simplifie cette tâche grâce à la fonction toast(), dont l’import correspond à import org.jetbrains.anko.toast. Elle peut être appelée de manière indifférente depuis une Activity ou un Fragment, avec un seul paramètre (le texte à afficher).

  1. Appelez la fonction toast() :

     toast(R.string.text_island)
    
  2. Alternativement, pour afficher le message plus longtemps, il est possible d’appeler la fonction longToast(), dont l’import correspond à import org.jetbrains.anko.longToast :

     longToast(R.string.text_island)
    

Avec le SDK Android, cela revient à utiliser la classe Toast, dont l’import correspond à import android.widget.Toast, depuis une Activity :

Toast.makeText(this, "${getString(R.string.text_island)}", Toast.LENGTH_SHORT).show()

ou bien :

Toast.makeText(this, "${getString(R.string.text_island)}", Toast.LENGTH_LONG).show()

Ouvrir une boite de dialogue

  1. Appelez la fonction alert(), dont l’import correspond à import org.jetbrains.anko.alert, cela dans son plus simple appareil :

     alert("YO").show()
    
  2. Appelez la fonction alert(), avec les boutons classiques ‘oui’, ‘non’ :

     alert("YO") {
       yesButton { toast("Yep") }
       noButton { }
     }.show()
    
  3. Appelez la fonction alert(), en offrant une boîte de dialogue un peu plus évoluée :

     alert("YO") {
       title = "Awesome quote"
       positiveButton("Love") { toast("Yo") }
       negativeButton("Not at all") { }
       neutralButton("May be")
     }.show()
    

Avec le SDK Android, cela revient à utiliser la classe AlertDialog, dont l’import correspond à import android.app.AlertDialog, depuis une Activity :

val bld = AlertDialog.Builder(this)
bld.setMessage(s)
bld.setNeutralButton("May be", null)
bld.create().show()

Lancer un autre écran

Afin d’empiler un second écran dans la pile d’écrans, le SDK Android fournit la classe Intent (cf. documentation officiel), représentant une intention, à combiner avec startActivity().

La bibliothèque Anko Commons propose la fonction avec un type réifié startActivity<>(), dont l’import correspond à import org.jetbrains.anko.startActivity. Elle permet de se passer de l’Intent.

  1. Appelez la fonction startActivity<>(), depuis une Activity :

     startActivity<MySecondaryActivity>()
    
  2. Alternativement, il est possible d’ajouter des données à communiquer à la seconde Activity, en passant des paramètres à la fonction startActivity<>() :

     startActivity<MySecondaryActivity>("id" to 3, "name" to "Macha")
    

Avec le SDK Android, cela revient à utiliser la classe Intent, dont l’import correspond à import android.content.Intent, depuis une Activity :

val intent = Intent(this, MySecondaryActivity::class.java)
intent.putExtra("id", 3)
intent.putExtra("name", "Macha")
startActivity(intent)

Ouvrir une page Internet

Afin d’ouvrir une page Internet avec le navigateur natif, il s’agit d’utiliser une intention fournit par le SDK Android, tout comme le lancement d’un second écran.

La bibliothèque Anko Commons propose la fonction browse(), dont l’import correspond à import org.jetbrains.anko.browse.

  1. Appelez la fonction browse() :

     browse("https://www.chillcoding.com/")
    

Avec le SDK Android, cela revient à utiliser la classe Intent, comme suit, depuis une Activity :

val url = "https://www.chillcoding.com/"
val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse(url)
startActivity(i)

Proposer d’envoyer un email

Afin de proposer d’envoyer un email, à l’utilisateur, avec une application native, le SDK Android fournit la classe Intent avec un paramétrage spécifique.

La bibliothèque Anko Commons propose la fonction email(), dont l’import correspond à import org.jetbrains.anko.email.

  1. Appelez la fonction email() :

     email("[email protected]", getString(R.string.subject_feedback), "")
    

Avec le SDK Android, cela revient à utiliser la classe Intent, instanciée de la façon suivante :

val intent = new Intent(Intent.ACTION_SENDTO);
intent.type = "text/plain"
intent.putExtra(Intent.EXTRA_EMAIL, "[email protected]")
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.subject_feedback))
intent.putExtra(Intent.EXTRA_TEXT, "")

startActivity(Intent.createChooser(intent, "Send Email"))

Proposer de partager du contenu

Afin de proposer de partager du contenu via les applications disponibles, installées au préalable par l’utilisateur (Slack, Messenger, etc.), le SDK Android fournit la classe Intent avec un paramétrage spécifique.

La bibliothèque Anko Commons propose la fonction share(), dont l’import correspond à import org.jetbrains.anko.share.

  1. Appelez la fonction share() :

     share(getString(R.string.text_share_app), getString(R.string.app_name))
    

Avec le SDK Android, cela revient à utiliser la classe Intent de la façon suivante :

val intent = Intent(Intent.ACTION_SEND);
intent.type = "text/plain"
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name))
intent.putExtra(Intent.EXTRA_TEXT, getString(R.string.text_share_app))

startActivity(Intent.createChooser(intent, "Share"))

Par ailleurs, l’implémentation de la fonction share() visible depuis la classe Intents.kt correspond à la fonction d’extension suivante :

fun Context.share(text: String, subject: String = ""): Boolean {
    try {
        val intent = Intent(android.content.Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(android.content.Intent.EXTRA_TEXT, text)
        startActivity(Intent.createChooser(intent, null))
        return true
    } catch (e: ActivityNotFoundException) {
        e.printStackTrace()
        return false
    }
}

Retour d’expérience

Finalement, la bibliothèque Anko Commons offre des fonctions d’extensions et autres implémentations Kotlin intéressantes. En particulier, elle permet de programmer très rapidement les tâches utilisateurs les plus courantes :

Cela dit, il est important de savoir ce qu’il y a sous le capot (Cmd ou Ctrl + clique :) afin de connaître l’implémentation effectuée à partir du SDK Android. Parfois, il est nécessaire de mettre les mains dans le cambouis afin de développer une fonctionnalité plus évoluée, voir plus complexe. La connaissance du SDK Android est alors bienvenue.

Aussi, l’utilisation des fonctions Anko Commons peuvent être restreintes à un contexte spécifique, c’est-à-dire qu’elles peuvent être appelées depuis une Activity ou bien depuis un Fragment. Leur intégration dans une architecture spécifiquement alambiqué n’est alors pas forcément adéquate.

Références :

  1. Anko on GitHub
  2. AnkoLogger documentation
  3. Dialogs using Anko by Antonio Leiva
  4. Why every Android developer should use Anko by Adrian Bukros

Partagez ou réagissez sur Twitter.

Vous avez trouvé une erreur ou voulez améliorer cet article ? Editez le directement !

Comments