1. Avant de commencer
Dans l'atelier de programmation précédent, vous avez créé une application Affirmations qui affiche une liste de texte dans un RecyclerView
.
Dans cet atelier de programmation, vous allez ajouter une image inspirante à chaque affirmation dans votre application. Vous allez afficher le texte et l'image de chaque déclaration dans une vignette, avec le widget MaterialCardView
de la bibliothèque Composants Material pour Android. Enfin, vous affinerez l'application en créant une interface plus cohérente et plus élégante. Voici une capture d'écran de l'application terminée :
Conditions préalables
- Vous êtes capable d'ajouter des ressources image à une application.
- Vous savez modifier une mise en page XML.
- Vous savez créer une application qui affiche une liste de texte dans un
RecyclerView
. - Vous savez créer un adaptateur pour un
RecyclerView
.
Points abordés
- Comment ajouter des images à la liste des affirmations affichées dans un
RecyclerView
. - Comment utiliser
MaterialCardView
dans la mise en page d'un élémentRecyclerView
. - Comment apporter des modifications visuelles dans l'interface utilisateur pour améliorer l'apparence de l'application.
Objectifs de l'atelier
- Créer une application Affirmations améliorée qui affiche une liste de vignettes à l'aide d'un
RecyclerView
. Chaque vignette contient une image et un texte d'affirmation.
Ce dont vous avez besoin
- Un ordinateur équipé d'Android Studio version 4.1 ou ultérieure.
- Une connexion Internet pour télécharger des fichiers image.
- L'application Affirmations de l'atelier de programmation précédent Créer une application Affirmations. (Aucun code de démarrage n'est fourni. La création de l'application est une condition préalable.)
2. Ajouter des images aux éléments de liste
Jusqu'à maintenant, vous avez créé un adaptateur ItemAdapter
pour afficher les chaînes d'affirmation dans un RecyclerView
. Sur le plan pratique, cette solution est très efficace, mais visuellement, elle manque de charme. Dans cette tâche, vous modifierez la mise en page de l'élément de liste et le code de l'adaptateur pour afficher les images associées aux affirmations.
Télécharger les images
- Pour commencer, ouvrez le projet d'application Affirmations de l'atelier de programmation précédent dans Android Studio. Si vous n'avez pas ce projet à disposition, suivez les étapes de l'atelier de programmation précédent pour en créer un. Revenez ensuite sur cette page.
- Ensuite, téléchargez les fichiers image sur votre ordinateur. Il devrait y avoir 10 images, une pour chaque affirmation de votre application. Le nom des fichiers doit suivre le format suivant :
image1.jpg
, puisimage10.jpg
, et ainsi de suite. - Copiez les images de votre ordinateur dans le dossier res > drawable de votre projet (
app/src/main/res/drawable
) dans Android Studio. Une fois ces ressources ajoutées à votre application, vous pourrez accéder à ces images depuis votre code en utilisant leur ID de ressource, commeR.drawable.image1
. Vous devrez peut-être recréer votre code pour Android Studio afin de trouver l'image.
Vous pouvez maintenant utiliser les images dans l'application.
Ajouter la prise en charge des images dans la classe Affirmation
Au cours de cette étape, vous ajouterez une propriété dans la classe de données Affirmation
pour contenir la valeur pour l'ID de ressource d'image. Ainsi, une seule instance d'objet Affirmation
contiendra l'ID de ressource pour le texte de l'affirmation et l'ID de ressource pour l'image associée à l'affirmation.
- Ouvrez le fichier
Affirmation.kt
dans le packagemodel
. - Modifiez le constructeur de la classe
Affirmation
en ajoutant un autre paramètreInt
nomméimageResourceId
.
Utiliser des annotations de ressource
stringResourceId
et imageResourceId
sont des nombres entiers. Cela semble correct, mais l'appelant pourrait malencontreusement transmettre les arguments dans le mauvais ordre (imageResourceId
en premier au lieu de stringResourceId
).
Pour éviter ce problème, vous pouvez utiliser des annotations de ressource. Les annotations sont utiles, car elles permettent d'ajouter des informations supplémentaires aux classes, méthodes ou paramètres. Les annotations sont toujours déclarées avec le symbole @. Dans ce cas, ajoutez l'annotation @StringRes
à votre propriété d'ID de ressource de chaîne, et l'annotation @DrawableRes
à votre propriété d'ID de ressource drawable. Vous recevrez ensuite un avertissement si le type d'ID de ressource indiqué est incorrect.
- Ajoutez l'annotation
@StringRes
àstringResourceId
. - Ajoutez l'annotation
@DrawableRes
àimageResourceId
. - Assurez-vous que les importations
androidx.annotation.DrawableRes
etandroidx.annotation.StringRes
sont ajoutées en haut de votre fichier après la déclaration du package.
Affirmation.kt
package com.example.affirmations.model
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
data class Affirmation(
@StringRes val stringResourceId: Int,
@DrawableRes val imageResourceId: Int
)
Initialiser la liste des affirmations avec des images
Maintenant que vous avez modifié le constructeur de la classe Affirmation
, vous devez mettre à jour la classe Datasource
. Transmettez un ID de ressource d'image à chaque objet Affirmation
initialisé.
- Ouvrez
Datasource.kt
. Une erreur s'affiche normalement pour chaque instanciation deAffirmation
. - Pour chaque
Affirmation
, ajoutez l'ID de ressource d'une image en tant qu'argument, commeR.drawable.image1
.
Datasource.kt
package com.example.affirmations.data
import com.example.affirmations.R
import com.example.affirmations.model.Affirmation
class Datasource() {
fun loadAffirmations(): List<Affirmation> {
return listOf<Affirmation>(
Affirmation(R.string.affirmation1, R.drawable.image1),
Affirmation(R.string.affirmation2, R.drawable.image2),
Affirmation(R.string.affirmation3, R.drawable.image3),
Affirmation(R.string.affirmation4, R.drawable.image4),
Affirmation(R.string.affirmation5, R.drawable.image5),
Affirmation(R.string.affirmation6, R.drawable.image6),
Affirmation(R.string.affirmation7, R.drawable.image7),
Affirmation(R.string.affirmation8, R.drawable.image8),
Affirmation(R.string.affirmation9, R.drawable.image9),
Affirmation(R.string.affirmation10, R.drawable.image10)
)
}
}
Ajouter un élément ImageView à la mise en page de l'élément de liste
Afin d'afficher une image pour chaque affirmation de votre liste, vous devez ajouter un ImageView
à la mise en page de votre élément. Comme vous disposez désormais de deux vues (TextView
et ImageView
), vous devez les placer en tant que vues "enfant" dans un ViewGroup
. Pour réorganiser les vues dans une colonne verticale, vous pouvez utiliser un LinearLayout
. La mise en page LinearLayout
aligne toutes les vues "enfant" dans une seule direction, verticale ou horizontale.
- Ouvrez res > layouts > list_item.xml. Ajoutez un
LinearLayout
autour duTextView
existant et définissez la propriété deorientation
survertical
. - Déplacez la ligne de déclaration
xmlns schema
de l'élémentTextView
vers l'élémentLinearLayout
pour résoudre l'erreur.
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
- Dans le
LinearLayout,
avantTextView,
, ajoutez un élémentImageView
avec un ID de ressourceitem_image
. - Définissez une largeur de
match_parent
et une hauteur de194dp
pourImageView
. En fonction de la taille de l'écran, cette valeur devrait toujours afficher plusieurs vignettes à l'écran simultanément. - Définissez la valeur de
scaleType
surcenterCrop.
. - Définissez l'attribut
importantForAccessibility
surno
, car l'image est utilisée à des fins décoratives.
<ImageView
android:layout_width="match_parent"
android:layout_height="194dp"
android:id="@+id/item_image"
android:importantForAccessibility="no"
android:scaleType="centerCrop" />
Mettre à jour ItemAdapter pour définir l'image
- Ouvrez
adapter/ItemAdapter.kt
(app > java > adapter > ItemAdapter). - Accédez à la classe
ItemViewHolder
. - Une instance
ItemViewHolder
doit contenir une référence à laTextView
et une référence à laImageView
dans la mise en page de l'élément de liste. Apportez la modification suivante.
Sous l'initialisation de la propriété textView
, ajoutez un val
nommé imageView
. Utilisez findViewById()
pour trouver la référence à ImageView
avec l'ID item_image
et attribuez-la à la propriété imageView
.
ItemAdapter.kt
class ItemViewHolder(private val view: View): RecyclerView.ViewHolder(view) {
val textView: TextView = view.findViewById(R.id.item_title)
val imageView: ImageView = view.findViewById(R.id.item_image)
}
- Recherchez la fonction
onBindViewHolder()
dansItemAdapter
. - Vous avez déjà défini
stringResourceId
pour l'affirmation surtextView
dansItemViewHolder
. Définissez maintenantimageResourceId
pour l'affirmation sur l'élémentImageView
de la vue de l'élément de liste.
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = dataset[position]
holder.textView.text = context.resources.getString(item.stringResourceId)
holder.imageView.setImageResource(item.imageResourceId)
}
- Exécutez l'application et faites défiler la liste des affirmations.
L'application est beaucoup plus élégante avec des images ! Vous pouvez toujours améliorer l'UI de l'application. Dans la section suivante, vous allez procéder à quelques légers ajustements dans l'application afin d'améliorer l'interface utilisateur.
3. Affiner l'interface utilisateur
Jusqu'à présent, vous avez créé une application fonctionnelle qui repose sur une liste de chaînes et d'images d'affirmations. Dans cette section, vous verrez comment de petits changements dans le code et le XML peuvent améliorer le rendu de l'application.
Ajouter une marge intérieure
Pour commencer, ajoutez un espace blanc entre les éléments de liste.
- Ouvrez
item_list.xml
(app > res > layout > item_list.xml) et ajoutez une marge intérieure de16dp
auLinearLayout
existant.
list_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
- Ajoutez une marge intérieure de
16dp
à l'élémentitem_title
deTextView
. - Dans
TextView
, définissez la valeur?attr/textAppearanceHeadline6
pour l'attributtextAppearance
.textAppearance
est un attribut qui vous permet d'appliquer un style spécifique au texte. Pour découvrir d'autres valeurs d'apparence prédéfinies, consultez la section TextAppearances de l'article de blog Attributs de thème courants.
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:textAppearance="?attr/textAppearanceHeadline6" />
- Exécutez l'application. La liste vous paraît-elle plus agréable à lire ?
Utiliser des vignettes
Il est toujours difficile de savoir si une image appartient au texte d'affirmation placé au-dessus ou en dessous. Pour résoudre ce problème, vous pouvez utiliser une vue Card (Vignette). Une vue "Card (Vignette)" vous permet de réunir facilement un groupe de vues tout en améliorant la cohérence visuelle du conteneur. Pour plus d'informations sur Material Design et l'utilisation des vignettes, consultez ce guide.
- Ajoutez un
MaterialCardView
autour duLinearLayout
existant. - Une fois encore, déplacez la déclaration du schéma de
LinearLayout
versMaterialCardView
. - Définissez la propriété
layout_width
de l'élémentMaterialCardView
surmatch_parent
et celle delayout_height
surwrap_content
. - Ajoutez un
layout_margin
de8dp
. - Supprimez la marge intérieure de
LinearLayout
pour limiter les espaces blancs. - Exécutez de nouveau l'application. Est-il plus facile de différencier chaque affirmation avec
MaterialCardView
?
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/item_image"
android:layout_width="match_parent"
android:layout_height="194dp"
android:importantForAccessibility="no"
android:scaleType="centerCrop" />
<TextView
android:id="@+id/item_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
android:textAppearance="?attr/textAppearanceHeadline6" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
Modifier les couleurs du thème de l'application
La couleur par défaut du thème de l'application n'est peut-être pas la plus apaisante. Dans cette tâche, vous définirez la couleur du thème de l'application sur bleu. Vous pourrez la modifier ultérieurement selon vos préférences !
Vous pouvez trouver des nuances de bleu prédéfinies dans la palette de couleurs Material Design en cliquant sur ce lien.
Dans cet atelier de programmation, vous allez utiliser ces couleurs issues de la palette Material Design :
- blue_200 :
#FF90CAF9
- blue_500 :
#FF2196F3
- blue_700 :
#FF1976D2
Ajouter des ressources de couleur
Centralisez la définition des couleurs utilisées dans votre application à l'aide du fichier colors.xml
.
- Ouvrez
colors.xml
(res > values > color.xml). - Ajoutez de nouvelles ressources de couleur au fichier pour les couleurs bleues définies ci-dessous :
<color name="blue_200">#FF90CAF9</color>
<color name="blue_500">#FF2196F3</color>
<color name="blue_700">#FF1976D2</color>
Modifier les couleurs du thème
Maintenant que vous disposez de nouvelles ressources de couleur, vous pouvez les utiliser dans votre thème.
- Ouvrez
themes.xml
(res > values > topics > topics.xml). - Accédez à la section
<!-- Primary brand color. -->
. - Ajoutez ou modifiez
colorPrimary
pour utiliser@color/blue_500
. - Ajoutez ou modifiez
colorPrimaryVariant
pour utiliser@color/blue_700
.
<item name="colorPrimary">@color/blue_500</item>
<item name="colorPrimaryVariant">@color/blue_700</item>
- Exécutez l'application. La barre d'application devient bleue.
Modifier les couleurs du thème sombre
Il est recommandé de choisir des couleurs plus désaturées pour le thème sombre de l'application.
- Ouvrez le fichier
themes.xml
du thème sombre (themes > topics.xml (night)). - Ajoutez ou modifiez les attributs de thème
colorPrimary
etcolorPrimaryVariant
comme suit :
<item name="colorPrimary">@color/blue_200</item>
<item name="colorPrimaryVariant">@color/blue_500</item>
- Exécutez votre application.
- Dans les Paramètres de votre appareil, activez le Thème sombre.
- L'application passe au thème sombre. Assurez-vous que votre application ressemble à la capture d'écran ci-dessous :
- À ce stade, vous pouvez également supprimer les couleurs inutilisées de votre fichier
colors.xml
(p. ex. les ressources en violet utilisées dans le thème de l'application par défaut).
Modifier l'icône d'application
Pour terminer, vous mettrez à jour l'icône de l'application.
- Téléchargez les fichiers de l'icône de l'application
ic_launcher_foreground.xml
etic_launcher_background.xml
. Si votre navigateur affiche le fichier au lieu de le télécharger, sélectionnez Fichier > Enregistrer la page sous pour l'enregistrer sur votre ordinateur. - Dans Android Studio, supprimez deux fichiers :
drawable/ic_launcher_background.xml
etdrawable-v24/ic_launcher_foreground.xml
, car il s'agit de l'icône d'application précédente. Vous pouvez décocher la case Safe delete (with usage search) (Suppression sécurisée [avec recherche de données d'utilisation]). - Ensuite, effectuez un clic droit sur le dossier res > drawable, puis sélectionnez New > Image Asset (Nouveau > Élément image).
- Dans la fenêtre Configure Image Asset (Configurer l'élément image), assurez-vous que l'option Foreground layer (Calque d'avant-plan) est sélectionnée.
- En dessous, recherchez le libellé Path (Chemin).
- Cliquez sur l'icône de dossier dans la zone de texte Path (Chemin).
- Recherchez et ouvrez le fichier
ic_launcher_foreground.xml
que vous avez téléchargé sur votre ordinateur.
- Passez à l'onglet Background Layer (Calque d'arrière-plan).
- Cliquez sur l'icône Browse (Parcourir) dans la zone de texte Path (Chemin).
- Recherchez et ouvrez le fichier
ic_launcher_background.xml
sur votre ordinateur. Aucune autre modification n'est nécessaire. - Appuyez sur Next (Suivant).
- Dans la boîte de dialogue Confirm Icon Path (Confirmer le chemin d'accès à l'icône), cliquez sur Finish (Terminer). Vous pouvez remplacer les icônes existantes.
- Pour respecter les bonnes pratiques, vous pouvez déplacer les nouveaux drawables vectoriels
ic_launcher_foreground.xml
etic_launcher_background.xml
dans un nouveau répertoire de ressources appelédrawable-anydpi-v26
. Les icônes adaptatives ont été introduites au niveau 26 de l'API. Ces ressources ne seront donc utilisées que sur les appareils exécutant l'API au niveau 26 ou supérieur (pour toutes les PPP). - Supprimez le répertoire
drawable-v24
s'il est vide. - Exécutez l'application : une magnifique nouvelle icône apparaît maintenant dans le panneau des applications !
- Pour finir, n'oubliez pas de reformater les fichiers Kotlin et XML du projet afin que votre code soit plus propre et respecte les consignes de style.
Félicitations ! Vous avez créé une application Affirmations inspirante.
Vous avez appris à afficher une liste de données dans une application Android : que pouvez-vous créer maintenant ?
4. Code de solution
Le code de solution pour l'application Affirmations se trouve dans le dépôt GitHub ci-dessous :
- Accédez à la page du dépôt GitHub fournie pour le projet.
- Vérifiez que le nom de la branche correspond à celui spécifié dans l'atelier de programmation. Par exemple, dans la capture d'écran suivante, le nom de la branche est main.
- Sur la page GitHub du projet, cliquez sur le bouton Code pour afficher une fenêtre pop-up.
- Dans la fenêtre pop-up, cliquez sur le bouton Download ZIP (Télécharger le fichier ZIP) pour enregistrer le projet sur votre ordinateur. Attendez la fin du téléchargement.
- Recherchez le fichier sur votre ordinateur (il se trouve probablement dans le dossier Téléchargements).
- Double-cliquez sur le fichier ZIP pour le décompresser. Un dossier contenant les fichiers du projet est alors créé.
Ouvrir le projet dans Android Studio
- Lancez Android Studio.
- Dans la fenêtre Welcome to Android Studio (Bienvenue dans Android Studio), cliquez sur Open (Ouvrir).
Remarque : Si Android Studio est déjà ouvert, sélectionnez l'option de menu File > Open (Fichier > Ouvrir).
- Dans l'explorateur de fichiers, accédez à l'emplacement du dossier du projet décompressé (il se trouve probablement dans le dossier Téléchargements).
- Double-cliquez sur le dossier de ce projet.
- Attendez qu'Android Studio ouvre le projet.
- Cliquez sur le bouton Run (Exécuter) pour créer et exécuter l'application. Assurez-vous qu'elle fonctionne correctement.
5. Résumé
- Pour afficher du contenu supplémentaire dans un
RecyclerView
, modifiez la classe de modèle de données et la source de données sous-jacentes. Ensuite, mettez à jour la mise en page et l'adaptateur des éléments de liste pour intégrer ces données dans les vues. - Utilisez les annotations de ressources pour vous assurer que le bon type d'ID de ressource est transmis à un constructeur de classe.
- Utilisez la bibliothèque Material Components pour Android pour que votre application respecte plus facilement les consignes Material Design recommandées.
- Utilisez
MaterialCardView
pour afficher le contenu dans une vignette Material. - De légères modifications de couleur et d'espacement dans votre application vous permettront d'améliorer son apparence.
6. En savoir plus
7. Défi
Dans cette série d'ateliers de programmation, vous avez appris à utiliser LinearLayoutManager
avec RecyclerView
. RecyclerView
peut utiliser différents LayoutManagers pour modifier la mise en page des données.
- Remplacez la propriété
layoutManager
deRecyclerView
parGridLayoutManager
. - Remplacez le nombre de colonnes par 3.
- Modifiez la mise en page de l'adaptateur pour visualiser les données dans une grille.