Menu umożliwiają użytkownikom kliknięcie ikony, pola tekstowego lub innego komponentu, a następnie wybranie opcji z listy w tymczasowym interfejsie. Z tego przewodnika dowiesz się, jak tworzyć zarówno proste, jak i bardziej złożone menu z separatorami i ikonami.
Interfejs API
Aby wdrożyć niestandardowe menu, użyj komponentów DropdownMenu, DropdownMenuItem i IconButton. Komponenty DropdownMenu i
DropdownMenuItem służą do wyświetlania pozycji menu, a
IconButton jest elementem wyzwalającym wyświetlanie lub ukrywanie menu.
Główne parametry komponentu DropdownMenu to:
expanded– wskazuje, czy menu jest widoczne.onDismissRequest– służy do obsługi zamykania menu.content– zawartość menu, która zwykle zawiera komponentyDropdownMenuItem.
Główne parametry DropdownMenuItem to:
text– określa treść wyświetlaną w pozycji menu.onClick– wywołanie zwrotne do obsługi interakcji z elementem w menu.
Tworzenie podstawowego menu
Poniższy fragment kodu przedstawia minimalną implementację 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... */ } ) } } }
Najważniejsze informacje o kodzie
- Definiuje podstawowe
DropdownMenuzawierające 2 pozycje. - Parametr
expandedokreśla widoczność menu jako rozwiniętego lub zwiniętego. - Parametr
onDismissRequestdefiniuje wywołanie zwrotne, które jest wykonywane, gdy użytkownik zamknie menu. - Komponent
DropdownMenuItemreprezentuje elementy, które można wybrać w menu. IconButtonpowoduje rozwinięcie i zwinięcie menu.
Wynik
Tworzenie dłuższego menu
Jeśli nie można wyświetlić wszystkich pozycji menu naraz, DropdownMenu domyślnie można przewijać. Poniższy fragment kodu tworzy dłuższe menu, które można przewijać:
@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... */ } ) } } } }
Najważniejsze informacje o kodzie
DropdownMenumożna przewijać, gdy łączna wysokość jego zawartości przekracza dostępną przestrzeń. Ten kod tworzy menu, które można przewijać i które wyświetla 100 elementów zastępczych.DropdownMenu- Pętla
forEachdynamicznie generuje komponentyDropdownMenuItem. Elementy nie są tworzone leniwie, co oznacza, że wszystkie 100 pozycji menu jest tworzonych i istnieje w kompozycji. - Po kliknięciu
IconButtonmenu rozwija się i zwijaDropdownMenu. - Lambda
onClickw każdymDropdownMenuItemumożliwia zdefiniowanie działania wykonywanego, gdy użytkownik wybierze pozycję menu.
Wynik
Powyższy fragment kodu tworzy menu, które można przewijać:
Tworzenie dłuższego menu z separatorami
Poniższy fragment kodu przedstawia bardziej zaawansowaną implementację menu. W tym fragmencie kodu do pozycji menu dodawane są ikony początkowe i końcowe, a grupy pozycji menu są oddzielone separatorami.
@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... */ } ) } } }
Ten kod definiuje DropdownMenu w Box.
Najważniejsze informacje o kodzie
- Parametry
leadingIconitrailingIcondodają ikony na początku i na końcuDropdownMenuItem. IconButtonpowoduje rozwinięcie menu.DropdownMenuzawiera kilka komponentówDropdownMenuItem, z których każdy reprezentuje działanie, które można wybrać.HorizontalDividerkomponenty wstawiają linię poziomą, która oddziela grupy pozycji menu.
Wynik
Powyższy fragment kodu tworzy menu z ikonami i separatorami:
Dodatkowe materiały
- Material Design: Menus