Android Kotlin

Ce tutoriel explique comment utiliser des bibliothèques Kotlin, relatives à l’interface utilisateur, dans un projet Android Studio, d’ores et déjà configuré avec Kotlin (cf. Configurer Kotlin dans un projet Android Studio [AK 2]). Le but est de créer une interface graphique simplement. Note : L’intérêt d’utiliser une bibliothèque est de faciliter le développement et de gagner du temps.

Dans cet article, il est expliqué comment :

GIF demo

Retrouvez sur GitHub, le projet BasicUI, relatif à cet article.

Historiquement, avec le langage Kotlin, la bibliothèque Anko Commons [1] était utilisée pour réaliser des développements classiques liés principalement à l’interface graphique.

Cela dit, de nos jours, les incontournables bibliothèques de développement d’application mobile Android avec le langage Kotlin sont :

  • Splitties [4] : ensemble de bibliothèques Kotlin multiplateformes légères
  • KTX [5] : ensemble d’extensions Kotlin soutenues par Google

Par ailleurs, il est possible d’utiliser le View Binding afin d’accéder facilement aux éléments d’une vue XML (cf. AK-4).

Importer une bibliothèque

Pour commencer, il est proposé d’importer la bibliothèque Splitties relative aux messages courts, toasts.

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

     ext.splitties_version = "3.0.0-beta01"
    
  3. Placez vous dans le fichier gradle du module build.gradle (Module: app)
  4. Ajoutez la dépendance Splitties Toast dans le bloc approprié dependencies :

     dependencies {
       ...
       implementation("com.louiscad.splitties:splitties-toast:$splitties_version")
     }
    

À présent, il est possible d’afficher un messsage court simplement.

Afficher un message court

Afin de présenter des messages d’information court à l’utilisateur, le SDK Android fournit la classe Toast (cf. documentation officiel).

La bibliothèque Splitties Toast simplifie cette tâche grâce à la fonction toast(), dont l’import correspond à import splitties.toast.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 splitties.toast.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. 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 ;).

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

ou bien alternativement :

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

Ouvrir une boite de dialogue

  1. Importez la bibliothèque Splitties Alert Dialog:

     implementation("com.louiscad.splitties:splitties-alertdialog-material:$splitties_version")
    
  2. Créez la fonction showAlertDialog() :

     private fun showAlertDialog() {
       materialAlertDialog {
           messageResource = R.string.text_alert_dialog
           okButton { showAlertDialog() }
           cancelButton()
       }.onShow {
           positiveButton.setText(R.string.show)
       }.show()
     }
    
  3. Appelez la fonction showAlertDialog() sur un bouton :

     findViewById<Button>(R.id.mainBtn).setOnClickListener { showAlertDialog() }
    

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

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

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.

Plus précisément, 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)
  1. Créez la fonction browse() :

     private fun browse(url: String) {
       var browser = Intent(Intent.ACTION_VIEW, Uri.parse("https://"+url))
       startActivity(browser)
     }
    
  2. Appelez la fonction ainsi créée sur un bouton :

     findViewById<Button>(R.id.mainBtn).setOnClickListener { browse("www.chillcoding.com") }
    

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.

Plus précisément, 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, arrayOf("[email protected]"))
intent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.subject_feedback))
intent.putExtra(Intent.EXTRA_TEXT, "")

startActivity(Intent.createChooser(intent, "Send Email"))
  1. Créez la fonction browse() :

     private fun sendEmail(to: String, subject: String, msg: String) {
       val emailIntent = Intent(Intent.ACTION_SEND)
    
       emailIntent.data = Uri.parse("mailto:")
       emailIntent.type = "text/plain"
       emailIntent.putExtra(Intent.EXTRA_EMAIL, arrayOf(to))
       emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject)
       emailIntent.putExtra(Intent.EXTRA_TEXT, msg)
    
       try {
           startActivity(Intent.createChooser(emailIntent, getString(R.string.title_send_email)))
       } catch (ex: ActivityNotFoundException) {
           toast(R.string.text_no_email_client)
       }
     }
    
  2. Appelez la fonction ainsi créée sur un bouton :

     sendEmail("[email protected]", "Hi", "Hello!")
    

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.

Plus précisément, 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"))
  1. Dans un nouveau fichier Tool.kt, implémentez la fonction d’extension :
    fun Context.share(text: Int, subject: Int = R.string.app_name): Boolean {
     try {
         val intent = Intent(android.content.Intent.ACTION_SEND)
         intent.type = "text/plain"
         intent.putExtra(android.content.Intent.EXTRA_SUBJECT, getString(subject))
         intent.putExtra(android.content.Intent.EXTRA_TEXT, getString(text))
         startActivity(Intent.createChooser(intent, null))
         return true
     } catch (e: ActivityNotFoundException) {
         e.printStackTrace()
         return false
     }
    }
    
  2. Appelez la fonction share() :

     share(R.string.text_share, R.string.title_share)
    

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 Splitties Activities propose la fonction avec un type réifié startActivity<>(), dont l’import correspond à implementation("com.louiscad.splitties:splitties-activities:$splitties_version"). Elle permet de se passer d’Intent.

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

     startActivity<SecondaryActivity>()
    
  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)

Afficher un message d’erreur

Afin d’afficher des messages dans la console du développeur Logcat, soit dans la console Android Monitor, le SDK Android fournit la classe Log (cf. documentation officiel). Il s’agit d’utiliser les méthodes Log.i(), Log.e(), etc. Elles prennent 2 paramètres :

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

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")

Retour d’expérience

Finalement, les bibliothèques Splitties offrent 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, voir plus adaptée à ses propres besoins. La connaissance du SDK Android est alors bienvenue comme elle a été mise en application sur les tâches :

Aussi, l’implémentation de ses propres fonctions d’extensions peuvent être restreintes à un contexte spécifique, c’est-à-dire qu’elles peuvent être appelées depuis une Activity ou bien depuis un Fragment.

Références :

  1. GoodBye Anko on GitHub
  2. Setting up a Material Components theme for Android
  3. Choose an open source license
  4. Splitties: All the Android splits
  5. Android KTX, Part of Android Jetpack.

Partagez ou réagissez sur Twitter.

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

Comments