Prévisualiser votre UI avec des aperçus composables

Un composable est défini par une fonction et annoté avec @Composable:

@Composable
fun SimpleComposable() {
    Text("Hello World")
}

Un élément de texte simple contenant les mots "Hello World"

Pour activer un aperçu de ce composable, créez un autre composable, annoté avec @Composable et @Preview. Ce nouveau composable annoté contient désormais le composable que vous avez créé initialement, SimpleComposable:

@Preview
@Composable
fun SimpleComposablePreview() {
    SimpleComposable()
}

L'annotation @Preview indique à Android Studio que ce composable doit être affiché dans la vue Conception de ce fichier. Vous pouvez voir les mises à jour en direct de l'aperçu de votre composable lorsque vous effectuez vos modifications.

GIF affichant les mises à jour en temps réel à l'aide de l'aperçu Compose

Vous pouvez ajouter des paramètres manuellement dans votre code pour personnaliser la manière dont Android Studio affiche @Preview. Vous pouvez même ajouter l'annotation @Preview à la même fonction plusieurs fois pour prévisualiser un composable avec différentes propriétés.

L'un des principaux avantages de l'utilisation de composables @Preview est d'éviter de dépendre de l'émulateur dans Android Studio. Vous pouvez enregistrer le démarrage de l'émulateur, qui nécessite beaucoup de mémoire, pour apporter d'autres modifications à l'aspect final, ainsi que la capacité de @Preview à apporter et à tester facilement de petites modifications de code.

Pour tirer le meilleur parti de l'annotation @Preview, veillez à définir vos écrans en fonction de l'état qu'ils reçoivent en entrée et des événements qu'ils génèrent.

Définissez votre @Preview

Android Studio propose plusieurs fonctionnalités pour étendre l'aperçu des composables. Vous pouvez modifier leur conception de conteneur, interagir avec ou les déployer directement sur un émulateur ou un appareil.

Dimensions

Par défaut, les dimensions @Preview sont choisies automatiquement pour encapsuler son contenu. Pour définir les dimensions manuellement, ajoutez les paramètres heightDp et widthDp. Ces valeurs sont déjà interprétées comme dp. Vous n'avez donc pas besoin d'y ajouter .dp:

@Preview(widthDp = 50, heightDp = 50)
@Composable
fun SquareComposablePreview() {
    Box(Modifier.background(Color.Yellow)) {
        Text("Hello World")
    }
}

Un carré jaune avec le texte
« Hello World »

Prévisualisation de la couleur dynamique

Si vous avez activé la couleur dynamique dans votre application, utilisez l'attribut wallpaper pour changer de fond d'écran et voir comment votre UI réagit au fond d'écran choisi par différents utilisateurs. Faites votre choix parmi les différents thèmes de fond d'écran proposés par la classe Wallpaper. Cette fonctionnalité nécessite Compose 1.4.0 ou une version ultérieure.

Utiliser avec différents appareils

Dans Android Studio Flamingo, vous pouvez modifier le paramètre device de l'annotation d'aperçu pour définir les configurations de vos composables sur différents appareils.

Exemple de fonction modulable

Lorsque le paramètre d'appareil comporte une chaîne vide (@Preview(device = "")), vous pouvez appeler la saisie semi-automatique en appuyant sur Ctrl+Space. Vous pouvez ensuite définir les valeurs de chaque paramètre.

Modifier l'exemple de fonction

À partir de la saisie semi-automatique, vous pouvez sélectionner n'importe quelle option d'appareil dans la liste, par exemple @Preview(device = "id:pixel_4"). Vous pouvez également saisir un appareil personnalisé en sélectionnant spec:width=px,height=px,dpi=int… pour définir les valeurs individuelles de chaque paramètre.

Liste des caractéristiques

Pour vous inscrire, appuyez sur Enter ou annulez avec Esc.

Si vous définissez une valeur non valide, la déclaration est soulignée en rouge, et un correctif peut être disponible (Alt + Enter (⌥ + pour macOS) > Remplacer par.... L'inspection tente de fournir un correctif qui ressemble le plus à votre entrée.

Exemple de valeur non valide

Langue

Pour tester différents paramètres régionaux utilisateur, ajoutez le paramètre locale:

@Preview(locale = "fr-rFR")
@Composable
fun DifferentLocaleComposablePreview() {
    Text(text = stringResource(R.string.greeting))
}

Élément de texte simple contenant le mot "Bonjour" avec un drapeau français

Définir la couleur de l'arrière-plan

Par défaut, votre composable s'affiche sur un arrière-plan transparent. Pour ajouter un arrière-plan, ajoutez les paramètres showBackground et backgroundColor. N'oubliez pas que backgroundColor est une valeur ARVB Long, et non Color:

@Preview(showBackground = true, backgroundColor = 0xFF00FF00)
@Composable
fun WithGreenBackground() {
    Text("Hello World")
}

Un rectangle vert avec les mots
« Hello World »

UI du système

Si vous devez afficher les barres d'état et d'action dans un aperçu, ajoutez le paramètre showSystemUi :

@Preview(showSystemUi = true)
@Composable
fun DecoratedComposablePreview() {
    Text("Hello World")
}

Fenêtre d'aperçu montrant une activité avec des barres d'état et d'action.

Mode UI

Le paramètre uiMode peut utiliser n'importe quelle constante Configuration.UI_* et vous permet de modifier le comportement de l'aperçu en conséquence. Par exemple, vous pouvez passer l'aperçu en mode Nuit pour observer la réaction du thème.

UI d'aperçu de Compose

LocalInspectionMode

Vous pouvez lire le CompositionLocal LocalInspectionMode pour voir si le composable est affiché dans un aperçu (dans un composant Inspectable). Si la composition est affichée dans un aperçu, LocalInspectionMode.current prend la valeur true. Ces informations vous permettent de personnaliser votre aperçu. Par exemple, vous pouvez afficher une image d'espace réservé dans la fenêtre d'aperçu au lieu d'afficher des données réelles.

Cela vous permet également de contourner les limites. Vous pouvez par exemple afficher des exemples de données au lieu d'appeler une requête réseau.

@Composable
fun GreetingScreen(name: String) {
    if (LocalInspectionMode.current) {
        // Show this text in a preview window:
        Text("Hello preview user!")
    } else {
        // Show this text in the app:
        Text("Hello $name!")
    }
}

Interagir avec votre @Preview

Android Studio fournit des fonctionnalités qui vous permettent d'interagir avec les aperçus définis. Cette interaction vous aide à comprendre le comportement d'exécution de vos aperçus et vous permet de mieux naviguer dans votre interface utilisateur à l'aide des aperçus.

Mode interactif

Le mode interactif vous permet d'interagir avec un aperçu de la même manière que sur un appareil exécutant votre programme, comme un téléphone ou une tablette. Le mode interactif est isolé dans un environnement de bac à sable (c'est-à-dire, isolé des autres aperçus), dans lequel vous pouvez cliquer sur des éléments et saisir l'entrée utilisateur dans l'aperçu. C'est un moyen rapide de tester différents états, gestes et même animations de votre composable.

Utilisateur cliquant sur le bouton
"interactif " de l'aperçu

Vidéo d'un utilisateur interagissant avec un aperçu

Navigation dans le code et contours d'un composable

Vous pouvez pointer sur un aperçu pour afficher les contours des composables qu'il contient. Cliquez sur le contour d'un composable pour accéder à sa définition dans la vue de l'éditeur.

Utilisateur pointant sur un aperçu, ce qui entraîne l'affichage dans Studio des contours de ses composables

Exécuter l'aperçu

Vous pouvez exécuter un @Preview spécifique sur un émulateur ou un appareil physique. L'aperçu est déployé dans la même application de projet qu'un nouveau Activity. Il partage donc le même contexte et les mêmes autorisations. Vous n'avez pas besoin d'écrire du code récurrent demandant une autorisation si celle-ci a déjà été accordée.

Cliquez sur l'icône Run Preview (Exécuter l'aperçu) Icône Exécuter l'aperçu à côté de l'annotation @Preview ou en haut de l'aperçu. Android Studio déploiera ce @Preview sur votre appareil connecté ou votre émulateur.

Utilisateur cliquant sur le bouton "Exécuter l'aperçu" de l'aperçu

Vidéo de l'utilisateur déployant un aperçu sur l'appareil

Copier le rendu @Preview

Chaque aperçu affiché peut être copié en tant qu'image en effectuant un clic droit dessus.

Utilisateur cliquant sur un aperçu pour le copier en tant qu'image.

Plusieurs aperçus de la même annotation @Preview

Vous pouvez présenter plusieurs versions du même composable @Preview avec des spécifications différentes ou différents paramètres transmis au composable. De cette façon, vous pouvez réduire le code récurrent que vous auriez besoin d'écrire dans le cas contraire.

Modèles d'aperçus multiples

androidx.compose.ui:ui-tooling-preview 1.6.0-alpha01+ introduit les modèles d'API Multipreview: @PreviewScreenSizes, @PreviewFontScales, @PreviewLightDark et @PreviewDynamicColors. Ainsi, avec une seule annotation, vous pouvez prévisualiser votre interface utilisateur Compose dans des scénarios courants.

Prévisualisation de différentes polices et tailles d'écran à l'aide de modèles

Créer des annotations d'aperçus multiples personnalisées

L'aperçu multiple vous permet de définir une classe d'annotation comportant elle-même plusieurs annotations @Preview avec des configurations différentes. L'ajout de cette annotation à une fonction composable affiche automatiquement tous les différents aperçus en même temps. Par exemple, vous pouvez utiliser cette annotation pour prévisualiser plusieurs appareils, tailles de police ou thèmes en même temps sans répéter ces définitions pour chaque composable.

Commencez par créer votre propre classe d'annotation personnalisée :

@Preview(
    name = "small font",
    group = "font scales",
    fontScale = 0.5f
)
@Preview(
    name = "large font",
    group = "font scales",
    fontScale = 1.5f
)
annotation class FontScalePreviews

Vous pouvez utiliser cette annotation personnalisée pour vos composables d'aperçu :

@FontScalePreviews
@Composable
fun HelloWorldPreview() {
    Text("Hello World")
}

Onglet "Design" (Conception) d'Android Studio montrant le composable avec une petite et une grande police

Vous pouvez combiner plusieurs annotations d'aperçus multiples et d'aperçus normaux pour créer un ensemble d'aperçus plus complet. Combiner des annotations d'aperçus multiples ne signifie pas que toutes les différentes combinaisons sont affichées. Chaque annotation d'aperçus multiples agit indépendamment et n'affiche que ses propres variantes.

@Preview(
    name = "Spanish",
    group = "locale",
    locale = "es"
)
@FontScalePreviews
annotation class CombinedPreviews

@CombinedPreviews
@Composable
fun HelloWorldPreview2() {
    MaterialTheme { Surface { Text(stringResource(R.string.hello_world)) } }
}

Onglet "Design" (Conception) d'Android Studio affichant le composable dans toutes les configurations.

La combinaison des aperçus multiples et de l'aperçu normal vous permet de tester de manière plus exhaustive de nombreuses propriétés de projets à grande échelle.

@Preview et de grands ensembles de données

Très souvent, vous devez transmettre un ensemble de données volumineux à l'aperçu de votre composable. Pour ce faire, il vous suffit de transmettre des échantillons de données à une fonction d'aperçu du composable en ajoutant un paramètre avec l'annotation @PreviewParameter.

@Preview
@Composable
fun UserProfilePreview(
    @PreviewParameter(UserPreviewParameterProvider::class) user: User
) {
    UserProfile(user)
}

Pour fournir des exemples de données, créez une classe qui implémente PreviewParameterProvider et renvoie les exemples de données sous forme de séquence.

class UserPreviewParameterProvider : PreviewParameterProvider<User> {
    override val values = sequenceOf(
        User("Elise"),
        User("Frank"),
        User("Julia")
    )
}

Cela permet d'afficher un seul aperçu par élément de données de la séquence:

Aperçus montrant les composables d&#39;Elise, de Frank et de Julia

Vous pouvez utiliser la même classe de fournisseur pour plusieurs aperçus. Si nécessaire, limitez le nombre d'aperçus en définissant le paramètre de limite.

@Preview
@Composable
fun UserProfilePreview2(
    @PreviewParameter(UserPreviewParameterProvider::class, limit = 2) user: User
) {
    UserProfile(user)
}

Limites et bonnes pratiques

Android Studio exécute le code d'aperçu directement dans la zone d'aperçu. Il ne nécessite pas l'exécution d'un émulateur ni d'un appareil physique, car il exploite une partie portative du framework Android appelée Layoutlib. Layoutlib est une version personnalisée du framework Android conçue pour s'exécuter en dehors des appareils Android. L'objectif de la bibliothèque est de fournir un aperçu d'une mise en page dans Android Studio très proche de son rendu sur les appareils.

Limites concernant les aperçus

En raison de la façon dont les aperçus sont affichés dans Android Studio, ils sont légers et ne nécessitent pas l'intégralité du framework Android pour les afficher. Toutefois, cela présente les limites suivantes:

  • Aucun accès au réseau
  • Aucun accès aux fichiers
  • Certaines API Context peuvent ne pas être entièrement disponibles.

Aperçus et ViewModels

Les aperçus sont limités lorsque vous utilisez ViewModel dans un composable. Le système d'aperçu n'est pas capable de construire tous les paramètres transmis à un ViewModel, tels que des dépôts, des cas d'utilisation, des gestionnaires ou des éléments similaires. De plus, si votre ViewModel participe à l'injection de dépendances (comme avec Hilt), le système d'aperçu ne peut pas créer l'intégralité du graphique de dépendances pour construire le ViewModel.

Lorsque vous essayez de prévisualiser un composable avec ViewModel, Android Studio affiche une erreur lors de l'affichage du composable concerné:

Volet &quot;Problème&quot; d&#39;Android Studio avec le message &quot;Échec de l&#39;instanciation d&#39;un ViewModel&quot;

Si vous souhaitez prévisualiser un composable qui utilise un ViewModel, vous devez créer un autre composable avec les paramètres de ViewModel transmis en tant qu'arguments du composable. De cette façon, vous n'avez pas besoin de prévisualiser le composable qui utilise ViewModel.

@Composable
fun AuthorColumn(viewModel: AuthorViewModel = viewModel()) {
  AuthorColumn(
    name = viewModel.authorName,
    // ViewModel sends the network requests and makes posts available as a state
    posts = viewModel.posts
  )
}

@Preview
@Composable
fun AuthorScreenPreview(
  // You can use some sample data to preview your composable without the need to construct the ViewModel
  name: String = sampleAuthor.name,
  posts: List<Post> = samplePosts[sampleAuthor]
) {
  AuthorColumn(...) {
    name = NameLabel(name),
    posts = PostsList(posts)
  }
}

Classe d'annotation @Preview

Vous pouvez toujours cliquer sur l 'annotation @Preview en appuyant sur la touche Ctrl ou ⌘+cliquer sur l'annotation dans Android Studio pour obtenir la liste complète des paramètres pouvant être ajustés lors de la personnalisation de votre aperçu.

annotation class Preview(
    val name: String = "",
    val group: String = "",
    @IntRange(from = 1) val apiLevel: Int = -1,
    val widthDp: Int = -1,
    val heightDp: Int = -1,
    val locale: String = "",
    @FloatRange(from = 0.01) val fontScale: Float = 1f,
    val showSystemUi: Boolean = false,
    val showBackground: Boolean = false,
    val backgroundColor: Long = 0,
    @UiMode val uiMode: Int = 0,
    @Device val device: String = Devices.DEFAULT,
    @Wallpaper val wallpaper: Int = Wallpapers.NONE,
)

Ressources supplémentaires

Pour savoir comment Android Studio favorise la facilité d'utilisation de @Preview et pour découvrir d'autres conseils sur les outils, consultez le blog Compose Tooling.