📘

Structure d’une application

Composantes d’une application


Une application a pour composants généraux : un manifeste, un dossier java avec les fichiers kotlin des activités et un dossier ressources avec notamment les images et les layouts correspondants des activités (en XML).

Une page de l’application est une activitĂ©. Chaque activitĂ© possĂšde un fichier de code (Kotlin, contrĂŽleur graphique) et un fichier de vue ou layout (XML).

Manifest

Le manifeste est la rĂ©fĂ©rence de l’application, obligatoire. Il donne le nom de l’application, les icĂŽnes, la liste des pages
 Toutes les pages (= activitĂ©s) doivent ĂȘtre inscrites dans le manifeste (ce qui est fait automatiquement). La balise intent-filter est le point d’entrĂ©e de l’application.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/Theme.MumblingInKotlin"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Activités et layouts

Une activitĂ© est un Ă©cran de l’application sous forme d’une classe Kotlin, stockĂ©es dans le dossier java dans des packages nommĂ©s par convention selon l’auteur et le nom du projet.

package com.lsarribouette.mumblinginkotlin

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

Une application est composĂ©e d’une ou plusieurs activitĂ©s. GrĂące au contrĂŽleur graphique, on peut rĂ©agir aux actions de l’utilisateur.

⚠
Une activité est forcément liée à un fichier layout en XML dans le dossier res/layout.

Dans Android Studio, un fichier layout s’affiche soit en mode Design (qui permet de choisir le layout, d’ajouter et modifier les vues et leurs attributs) soit en mode Code (qui traduit le rĂ©sultat en code XML, bien sĂ»r modifiable).

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Ressources

La gestion des ressources est plus contraignante qu’en web : le nom des dossiers est fondamental.

Dans res, les ressources sont d’abord organisĂ©es par catĂ©gorie :

  • drawable pour les “dessinables” donc les images
  • layout pour les vues des activitĂ©s (XML)
  • mipmap pour les icĂŽnes
  • values, xml, raw (pour les fonts)


Chacune de ces catĂ©gories peut ĂȘtre complĂ©tĂ©e avec un ou plusieurs qualificateurs : densitĂ© d’écran (mdpi Ă  xxxhdpi), landscape, langue (en, fr
), nightmode. Il est possible de prĂ©ciser la version d’Android utilisĂ©e.

Les informations sont sĂ©parĂ©es par un tiret -. Un dossier est donc nommĂ© avec plus ou moins d’informations : categorie, categorie-qualif, categorie-version, categorie-qualif1-qualif2-version...

â„č
Dans l’IDE, on voit les qualificateurs entre parenthĂšses par commoditĂ©. Dans l’explorateur de fichiers, on voit bien un dossier par catĂ©gorie-qualificateur-version.
⚠
On ne peut pas créer de fichiers ressources à la racine, ils doivent obligatoirement se trouver dans des dossiers qui respectent la norme Android.
⚙
Outils : Material Design, ensemble de rĂšgles et bonnes pratiques dĂ©finies par Google afin d’harmoniser les applications Android : https://m3.material.io/. Human interface guidelines est l’équivalent Apple : https://developer.apple.com/design/human-interface-guidelines/guidelines/overview.

Pour ajouter une ressource :

clique-droit sur un dossier

> New

> choix du type de ressource Ă  ajouter, dont Image Asset et Vector Asset (icĂŽnes)

BP : on prĂ©fĂšre utiliser des formats vectoriels (XML sous forme d’une somme de couches SVG) qui sont plus lĂ©gers, plus adaptables.

Pour accéder à une ressource,

Exemple : afficher une icĂŽne

On ajoute la ressource de l’icîne :

clique-droit sur drawable > New > Vector Asset : on retrouve la liste de toutes les icĂŽnes Google oĂč on peut modifier le style, la couleur > Confirm path

L’icîne apparait dans le dossier, en vectoriel.

On ouvre le layout activity_main.xml, on glisse-dépose une ImageView, on choisit une icÎne.

On vient d’ajouter une image sur la “vue” principale. On peut regarder la vue code oĂč on retrouve une balise ImageView, oĂč l’icĂŽne est bien appelĂ©e avec @type/identifiant-ressource : @drawable/outline_local_florist_24.

A gauche, le mode Design et Ă  droite, le rĂ©sultat sur l’application mobile.
<ImageView
        android:id="@+id/imageView"
        android:layout_width="75dp"
        android:layout_height="81dp"
        android:layout_marginBottom="48dp"
        android:contentDescription="Une jolie fleur pour mon Hello World"
        app:layout_constraintBottom_toTopOf="@+id/textView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1.0"
        app:srcCompat="@drawable/outline_local_florist_24" />

Interfaces graphiques


Tout ce qui est graphique étend View.

Il y a deux types de vues : les vues classiques View (textes, images, formulaires, boutons
) et les groupes de vues ViewGroup ou layout (qui organise les éléments entre eux).

BP : On met les vues dans des layouts pour faciliter l’organisation dans la page (ce qui signifie que toute zone de texte ou bouton est contenue dans un layout et rien ne se balade tout seul).

View

Quelques exemples de vues disponibles.

Les vues les plus communes :

Les boutons :

Les inputs (saisies par l’utilisateur) :

Les widgets :

ViewGroup (ou Layout)

Les layouts disponibles :

Un LinearLayout organise les vues horizontalement ou verticalement.

Un FrameLayout ne contient qu’une seule vue qui recouvre tout l’espace.

Un ConstraintLayout permet de positionner les vues selon des contraintes et selon d’autres vues (par exemple, deux boutons que l’on chaine et qui se placent dynamiquement au centre — mĂȘme leur taille est dynamique).

⚠
On est obligé de contraindre toutes les vues du ConstraintLayout.
BP : on n’utilise pas le GridLayout parce que c’est statique, on utilise plutĂŽt une liste avec un affichage sous forme de grille. BP : on crĂ©e des layouts spĂ©cifiques pour les diffĂ©rentes tailles d’écran.

Dimensions

Deux unités de mesure :

Android gÚre déjà la police du téléphone (accessibilité) donc il faut utiliser le sp.

â„č
Les styles sont prédéfinis avec notamment une taille par title, body (souvent 12sp)


Internationalisation

Pour un TextView, on n’écrit pas directement la valeur de la String Ă  afficher mais la rĂ©fĂ©rence Ă  une variable (constante) : @string/id_string_a_afficher.

Les Strings sont stockées dans un fichier strings.xml dans res/values.

<resources>
    <string name="app_name" translatable="false">MumblingInKotlin</string>
    <string name="icon_flower_name">Une jolie fleur pour mon Hello World</string>
</resources>
â„č
On peut prĂ©ciser que certaines Strings ne sont pas traduisibles avec translatable="false", souvent le nom de l’application par exemple.

Pour traduire l’application dans plusieurs langues, on crĂ©e un fichier par langue avec le qualificateur correspondant (-en, -fr, -de
).

On ajoute ensuite les Strings traduites, Ă  la main dans le fichier ou depuis l’éditeur.

<resources>
    <string name="app_name">MumblingInKotlin</string>
    <string name="icon_flower_name">A nice flower for my Hello World</string>
</resources>
â„č
RTL (right to left) : Dans un ConstraintLayout, on a end et start pour les contraintes de dĂ©but et de fin du texte (et pas droite et gauche), comme ça c’est bon pour les langues qui se lisent de droite Ă  gauche.