Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
Une application multimédia qui s'exécute sur un téléviseur doit permettre aux utilisateurs de parcourir son offre de contenu, de faire une sélection et de lancer la lecture du contenu. L'expérience de navigation dans le contenu des applications de ce type doit être simple, intuitive, visuellement agréable et engageante.
Un navigateur de catalogue multimédia se compose généralement de plusieurs sections, chacune contenant une liste de contenus multimédias. Voici quelques exemples de sections dans un catalogue multimédia : playlists, contenus mis en avant, catégories recommandées.
Figure 1. Écran de catalogue type. Les utilisateurs peuvent parcourir les données du catalogue vidéo.
Utilisez les fonctions fournies par Compose pour TV afin d'implémenter une interface utilisateur permettant de parcourir la musique ou les vidéos du catalogue multimédia de votre application.
Créer une fonction composable pour le catalogue
Tout ce qui s'affiche à l'écran est implémenté en tant que fonction composable dans Compose pour TV. Commencez par définir une fonction composable pour le navigateur du catalogue multimédia :
CatalogBrowser est la fonction composable qui implémente votre navigateur de catalogue multimédia. La fonction utilise les arguments suivants :
Liste des contenus mis en avant.
Liste des sections.
Objet Modifier.
Une fonction de rappel qui déclenche une transition d'écran.
Définir des éléments d'UI
Compose pour TV propose des listes "lazy", un composant permettant d'afficher un grand nombre d'éléments (ou une liste d'une longueur indéterminée). Appelez LazyColumn pour placer les sections verticalement. LazyColumn fournit un bloc LazyListScope.() -> Unit qui propose un DSL pour définir le contenu des éléments. Dans l'exemple suivant, chaque section est placée dans une liste verticale avec un espace de 16 dp entre les sections :
Dans l'exemple, la fonction composable Section définit la façon d'afficher les sections.
Dans la fonction suivante, LazyRow montre comment cette version horizontale de LazyColumn est également utilisée pour définir une liste horizontale avec un bloc LazyListScope.() -> Unit en appelant le DSL fourni :
Le composable Section utilise le composant Text.
Le texte et les autres composants définis dans Material Design sont proposés dans la bibliothèque tv-material . Vous pouvez modifier le style des textes tel qu'il est défini dans Material Design en vous référant à l'objet MaterialTheme.
Cet objet est également fourni par la bibliothèque tv-material.
Card fait partie de la bibliothèque tv-material.
MovieCard définit la façon dont chaque donnée de film est affichée dans le catalogue, comme indiqué dans l'extrait de code suivant :
Dans l'exemple décrit précédemment, tous les films sont affichés de manière égale.
Elles ont la même superficie et ne présentent aucune différence visuelle.
Vous pouvez en mettre en évidence certains avec Carousel.
Le carrousel affiche les informations dans un ensemble d'éléments qui peuvent glisser, s'estomper ou se déplacer dans la vue. Vous utilisez le composant pour mettre en avant des contenus, comme des films récemment disponibles ou de nouveaux épisodes de séries TV.
Carousel vous demande au moins de spécifier le nombre d'éléments que contient le carrousel et comment dessiner chaque élément. Le premier peut être spécifié avec itemCount. La seconde peut être transmise en tant que lambda. Le numéro d'index de l'élément affiché est transmis au lambda. Vous pouvez déterminer l'élément affiché avec la valeur d'index donnée :
Carousel peut être un élément d'une liste paresseuse, comme TvLazyColumn.
L'extrait suivant montre le composable FeaturedCarousel au-dessus de tous les composables Section :
Le contenu et les exemples de code de cette page sont soumis aux licences décrites dans la Licence de contenu. Java et OpenJDK sont des marques ou des marques déposées d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/08/27 (UTC).
[[["Facile à comprendre","easyToUnderstand","thumb-up"],["J'ai pu résoudre mon problème","solvedMyProblem","thumb-up"],["Autre","otherUp","thumb-up"]],[["Il n'y a pas l'information dont j'ai besoin","missingTheInformationINeed","thumb-down"],["Trop compliqué/Trop d'étapes","tooComplicatedTooManySteps","thumb-down"],["Obsolète","outOfDate","thumb-down"],["Problème de traduction","translationIssue","thumb-down"],["Mauvais exemple/Erreur de code","samplesCodeIssue","thumb-down"],["Autre","otherDown","thumb-down"]],["Dernière mise à jour le 2025/08/27 (UTC)."],[],[],null,["A media app that runs on a TV needs to allow users to browse its content\nofferings, make a selection, and start playing content. The content browsing\nexperience for apps of this type should be simple, intuitive, and visually\npleasing and engaging.\n\nA media catalog browser tends to consist of several sections, and each section\nhas a list of media content. Examples of sections in a media catalog include:\nplaylists, featured content, recommended categories.\n**Figure 1.** Typical catalog screen. Users are able to browse video catalog data.\n\nUse the functions provided by Compose for TV to implement a user\ninterface for browsing music or videos from your app's media catalog.\n\nCreate a composable function for catalog\n\nEverything appearing on a display is implemented as a composable function in\nCompose for TV. Start by defining a composable\nfunction for the media catalog browser: \n\n @Composable\n fun CatalogBrowser(\n featuredContentList: List\u003cMovie\u003e,\n sectionList: List\u003cSection\u003e,\n modifier: Modifier = Modifier,\n onItemSelected: (Movie) -\u003e Unit = {},\n ) {\n // ToDo: add implementation\n }\n\n`CatalogBrowser` is the composable function implementing your media catalog\nbrowser. The function takes the following arguments:\n\n- List of featured content.\n- List of sections.\n- A Modifier object.\n- A callback function, which triggers a screen transition.\n\nSet UI elements\n\nCompose for TV offers lazy lists, a component to display a large\nnumber of items (or a list of an unknown length). Call\n[`LazyColumn`](/reference/kotlin/androidx/compose/foundation/lazy/package-summary#LazyColumn(androidx.compose.ui.Modifier,androidx.compose.foundation.lazy.LazyListState,androidx.compose.foundation.layout.PaddingValues,kotlin.Boolean,androidx.compose.foundation.layout.Arrangement.Vertical,androidx.compose.ui.Alignment.Horizontal,androidx.compose.foundation.gestures.FlingBehavior,kotlin.Boolean,kotlin.Function1))\nto place sections vertically. `LazyColumn` provides a\n[`LazyListScope.() -\u003e Unit`](/reference/kotlin/androidx/compose/foundation/lazy/LazyListScope)\nblock, which offers a DSL to define item contents. In the following example,\neach section is placed in a vertical list with a 16 dp gap between sections: \n\n @Composable\n fun CatalogBrowser(\n featuredContentList: List\u003cMovie\u003e,\n sectionList: List\u003cSection\u003e,\n modifier: Modifier = Modifier,\n onItemSelected: (Movie) -\u003e Unit = {},\n ) {\n LazyColumn(\n modifier = modifier.fillMaxSize(),\n verticalArrangement = Arrangement.spacedBy(16.dp)\n ) {\n items(sectionList) { section -\u003e\n Section(section, onItemSelected = onItemSelected)\n }\n }\n }\n\nIn the example, `Section` composable function defines how to display sections.\nIn the following function, [`LazyRow`](/reference/kotlin/androidx/compose/foundation/lazy/package-summary#LazyRow(androidx.compose.ui.Modifier,androidx.compose.foundation.lazy.LazyListState,androidx.compose.foundation.layout.PaddingValues,kotlin.Boolean,androidx.compose.foundation.layout.Arrangement.Horizontal,androidx.compose.ui.Alignment.Vertical,androidx.compose.foundation.gestures.FlingBehavior,kotlin.Boolean,kotlin.Function1)) demonstrates how this\nhorizontal version of [`LazyColumn`](/reference/kotlin/androidx/compose/foundation/lazy/package-summary#LazyColumn(androidx.compose.ui.Modifier,androidx.compose.foundation.lazy.LazyListState,androidx.compose.foundation.layout.PaddingValues,kotlin.Boolean,androidx.compose.foundation.layout.Arrangement.Vertical,androidx.compose.ui.Alignment.Horizontal,androidx.compose.foundation.gestures.FlingBehavior,kotlin.Boolean,kotlin.Function1)) is similarly used to\ndefine a horizontal list with a `LazyListScope.() -\u003e Unit` block by calling\nthe provided DSL: \n\n @Composable\n fun Section(\n section: Section,\n modifier: Modifier = Modifier,\n onItemSelected: (Movie) -\u003e Unit = {},\n ) {\n Text(\n text = section.title,\n style = MaterialTheme.typography.headlineSmall,\n )\n LazyRow(\n modifier = modifier,\n horizontalArrangement = Arrangement.spacedBy(8.dp)\n ) {\n items(section.movieList){ movie -\u003e\n MovieCard(\n movie = movie,\n onClick = { onItemSelected(movie) }\n )\n }\n }\n }\n\nIn the `Section` composable, the [`Text`](/reference/kotlin/androidx/tv/material3/package-summary#Text(androidx.compose.ui.text.AnnotatedString,androidx.compose.ui.Modifier,androidx.compose.ui.graphics.Color,androidx.compose.ui.unit.TextUnit,androidx.compose.ui.text.font.FontStyle,androidx.compose.ui.text.font.FontWeight,androidx.compose.ui.text.font.FontFamily,androidx.compose.ui.unit.TextUnit,androidx.compose.ui.text.style.TextDecoration,androidx.compose.ui.text.style.TextAlign,androidx.compose.ui.unit.TextUnit,androidx.compose.ui.text.style.TextOverflow,kotlin.Boolean,kotlin.Int,kotlin.collections.Map,kotlin.Function1,androidx.compose.ui.text.TextStyle)) component is used.\nText and other components\ndefined in Material Design are offered in the tv-material library . You can\nchange the texts' style as defined in Material Design by referring to the\n[`MaterialTheme`](/reference/kotlin/androidx/tv/material3/MaterialTheme) object.\nThis object is also provided by the tv-material library.\n[`Card`](/reference/kotlin/androidx/tv/material3/package-summary#Card(kotlin.Function0,androidx.compose.ui.Modifier,androidx.tv.material3.CardShape,androidx.tv.material3.CardColors,androidx.tv.material3.CardScale,androidx.tv.material3.CardBorder,androidx.tv.material3.CardGlow,androidx.compose.foundation.interaction.MutableInteractionSource,kotlin.Function1)) is part of the tv-material library.\n`MovieCard` defines how each movie data is rendered in the catalog defined\nas the following snippet: \n\n @Composable\n fun MovieCard(\n movie: Movie,\n modifier: Modifier = Modifier,\n onClick: () -\u003e Unit = {}\n ) {\n Card(modifier = modifier, onClick = onClick){\n AsyncImage(\n model = movie.thumbnailUrl,\n contentDescription = movie.title,\n )\n }\n }\n\n| **Note:** `AsyncImage` is a composable that loads an image from the internet. See [Loading Images](/develop/ui/compose/graphics/images/loading#internet-loading) for details.\n\nHighlight featured content\n\nIn the example described earlier, all movies are displayed equally.\nThey have the same area, no visual difference between them.\nYou can highlight some of them with [`Carousel`](/reference/kotlin/androidx/tv/material3/package-summary#Carousel(kotlin.Int,androidx.compose.ui.Modifier,androidx.tv.material3.CarouselState,kotlin.Long,androidx.compose.animation.ContentTransform,androidx.compose.animation.ContentTransform,kotlin.Function1,kotlin.Function2)).\n\nCarousel displays the information in a set of items that can slide, fade, or\nmove into view. You use the component to highlight featured content, such as\nnewly available movies or new episodes of TV programs.\n\n[`Carousel`](/reference/kotlin/androidx/tv/material3/package-summary#Carousel(kotlin.Int,androidx.compose.ui.Modifier,androidx.tv.material3.CarouselState,kotlin.Long,androidx.compose.animation.ContentTransform,androidx.compose.animation.ContentTransform,kotlin.Function1,kotlin.Function2))\nexpects you to at least specify the number of items that Carousel has and how to\ndraw each item. The first one can be specified with `itemCount`. The second one\ncan be passed as a lambda. The index number of the displayed item is\ngiven to the lambda. You can determine the displayed item with the\ngiven index value: \n\n @Composable\n function FeaturedCarousel(\n featuredContentList: List\u003cMovie\u003e,\n modifier: Modifier = Modifier,\n ) {\n Carousel(\n itemCount = featuredContentList.size,\n modifier = modifier,\n ) { index -\u003e\n val content = featuredContentList[index]\n Box {\n AsyncImage(\n model = content.backgroundImageUrl,\n contentDescription = content.description,\n placeholder = painterResource(\n id = R.drawable.placeholder\n ),\n contentScale = ContentScale.Crop,\n modifier = Modifier.fillMaxSize()\n )\n Text(text = content.title)\n }\n }\n }\n\n`Carousel` can be an item of a lazy list, such as `TvLazyColumn`.\nThe following snippet shows `FeaturedCarousel` composable on top of the\nall `Section` composables: \n\n @Composable\n fun CatalogBrowser(\n featuredContentList: List\u003cMovie\u003e,\n sectionList: List\u003cSection\u003e,\n modifier: Modifier = Modifier,\n onItemSelected: (Movie) -\u003e Unit = {},\n ) {\n TvLazyColumn(\n modifier = modifier.fillMaxSize(),\n verticalArrangement = Arrangement.spacedBy(16.dp)\n ) {\n\n item {\n FeaturedCarousel(featuredContentList)\n }\n\n items(sectionList) { section -\u003e\n Section(section, onItemSelected = onItemSelected)\n }\n }\n }"]]