
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.
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...
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,
- en Kotlin, on utilise
R.type.identifiant-ressource(par exemple :R.string.hello,R.layout.activity_main)
- en XML, on utilise
@type/identifiant-ressource(par exemple,@string/hello)
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.

<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.
ViewGroup (ou Layout)
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).
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 :
- sp = scale-independent pixels â> pour les polices dâĂ©criture
- dp = density-independent pixels â> pour le reste
Android gÚre déjà la police du téléphone (accessibilité) donc il faut utiliser le sp.
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>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âŠ).
- clique-droit sur values > New > Values Resource File
> File name : toujours
strings(il mettra le .xml), choix du qualificateur : Localeen> Finish
- on peut aussi crĂ©er le fichier depuis lâĂ©diteur Translations Editor
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>



