Les menus déroulants permettent aux utilisateurs de cliquer sur une icône, un champ de texte ou un autre composant, puis de sélectionner une option dans une liste sur une surface temporaire. Ce guide explique comment créer des menus de base et des menus plus complexes avec des séparateurs et des icônes.
Surface de l'API
Utilisez les composants DropdownMenu
, DropdownMenuItem
et IconButton
pour implémenter un menu déroulant personnalisé. Les composants DropdownMenu
et DropdownMenuItem
sont utilisés pour afficher les éléments de menu, tandis que IconButton
est le déclencheur pour afficher ou masquer le menu déroulant.
Voici les principaux paramètres du composant DropdownMenu
:
expanded
: indique si le menu est visible.onDismissRequest
: permet de gérer la fermeture du menu.content
: contenu composable du menu, qui contient généralement des composablesDropdownMenuItem
.
Voici les principaux paramètres de DropdownMenuItem
:
text
: définit le contenu affiché dans l'élément de menu.onClick
: rappel pour gérer l'interaction avec l'élément du menu.
Créer un menu déroulant de base
L'extrait de code suivant illustre une implémentation minimale de DropdownMenu
:
@Composable fun MinimalDropdownMenu() { var expanded by remember { mutableStateOf(false) } Box( modifier = Modifier .padding(16.dp) ) { IconButton(onClick = { expanded = !expanded }) { Icon(Icons.Default.MoreVert, contentDescription = "More options") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false } ) { DropdownMenuItem( text = { Text("Option 1") }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Option 2") }, onClick = { /* Do something... */ } ) } } }
Points clés concernant le code
- Définit un
DropdownMenu
de base contenant deux éléments de menu. - Le paramètre
expanded
contrôle la visibilité du menu (développé ou réduit). - Le paramètre
onDismissRequest
définit un rappel qui s'exécute lorsque l'utilisateur ferme le menu. - Le composable
DropdownMenuItem
représente les éléments sélectionnables dans le menu déroulant. - Un
IconButton
déclenche le développement et le rétrécissement du menu.
Résultat
Créer un menu déroulant plus long
DropdownMenu
est à faire défiler par défaut si tous les éléments de menu ne peuvent pas être affichés en même temps. L'extrait de code suivant crée un menu déroulant plus long et à faire défiler:
@Composable fun LongBasicDropdownMenu() { var expanded by remember { mutableStateOf(false) } // Placeholder list of 100 strings for demonstration val menuItemData = List(100) { "Option ${it + 1}" } Box( modifier = Modifier .padding(16.dp) ) { IconButton(onClick = { expanded = !expanded }) { Icon(Icons.Default.MoreVert, contentDescription = "More options") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false } ) { menuItemData.forEach { option -> DropdownMenuItem( text = { Text(option) }, onClick = { /* Do something... */ } ) } } } }
Points clés concernant le code
DropdownMenu
est à faire défiler lorsque la hauteur totale de son contenu dépasse l'espace disponible. Ce code crée unDropdownMenu
à faire défiler qui affiche 100 éléments d'espace réservé.- La boucle
forEach
génère dynamiquement des composablesDropdownMenuItem
. Les éléments ne sont pas créés de manière paresseuse, ce qui signifie que les 100 éléments de liste déroulante sont créés et existent dans la composition. - Le
IconButton
déclenche le développement et le repliage duDropdownMenu
lorsqu'il est cliqué. - Le lambda
onClick
de chaqueDropdownMenuItem
vous permet de définir l'action effectuée lorsque l'utilisateur sélectionne un élément de menu.
Résultat
L'extrait de code précédent génère le menu à faire défiler suivant:
Créer un menu déroulant plus long avec des séparateurs
L'extrait de code suivant montre une implémentation plus avancée d'un menu déroulant. Dans cet extrait de code, des icônes de début et de fin sont ajoutées aux éléments de menu, et des séparateurs séparent les groupes d'éléments de menu.
@Composable fun DropdownMenuWithDetails() { var expanded by remember { mutableStateOf(false) } Box( modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { IconButton(onClick = { expanded = !expanded }) { Icon(Icons.Default.MoreVert, contentDescription = "More options") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false } ) { // First section DropdownMenuItem( text = { Text("Profile") }, leadingIcon = { Icon(Icons.Outlined.Person, contentDescription = null) }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Settings") }, leadingIcon = { Icon(Icons.Outlined.Settings, contentDescription = null) }, onClick = { /* Do something... */ } ) HorizontalDivider() // Second section DropdownMenuItem( text = { Text("Send Feedback") }, leadingIcon = { Icon(Icons.Outlined.Feedback, contentDescription = null) }, trailingIcon = { Icon(Icons.AutoMirrored.Outlined.Send, contentDescription = null) }, onClick = { /* Do something... */ } ) HorizontalDivider() // Third section DropdownMenuItem( text = { Text("About") }, leadingIcon = { Icon(Icons.Outlined.Info, contentDescription = null) }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Help") }, leadingIcon = { Icon(Icons.AutoMirrored.Outlined.Help, contentDescription = null) }, trailingIcon = { Icon(Icons.AutoMirrored.Outlined.OpenInNew, contentDescription = null) }, onClick = { /* Do something... */ } ) } } }
Ce code définit un DropdownMenu
dans un Box
.
Points clés concernant le code
- Les paramètres
leadingIcon
ettrailingIcon
ajoutent des icônes au début et à la fin d'unDropdownMenuItem
. - Un
IconButton
déclenche le développement du menu. DropdownMenu
contient plusieurs composablesDropdownMenuItem
, chacun représentant une action sélectionnable.- Les composables
HorizontalDivider
insèrent une ligne horizontale pour séparer les groupes d'éléments de menu.
Résultat
L'extrait précédent génère un menu déroulant avec des icônes et des séparateurs:
Ressources supplémentaires
- Material Design: Menus