Menu rozwijane umożliwiają użytkownikom kliknięcie ikony, pola tekstowego lub innego komponentu, a następnie wybranie opcji z listy na tymczasowej powierzchni. Z tego przewodnika dowiesz się, jak tworzyć zarówno podstawowe menu, 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 elementów menu, a IconButton jest aktywatorem wyświetlania lub ukrywania menu.
Najważniejsze parametry komponentu DropdownMenu:
expanded: wskazuje, czy menu jest widoczne.onDismissRequest: służy do obsługi zamykania menu.content: treść menu, która może być funkcją kompozycyjną, zwykle zawierająca funkcje kompozycyjneDropdownMenuItem.
Najważniejsze 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 pokazuje minimalną implementację DropdownMenu:
@Composable fun MinimalDropdownMenu() { var expanded by remember { mutableStateOf(false) } Box( modifier = Modifier .padding(16.dp) ) { IconButton(onClick = { expanded = !expanded }) { Icon(painter = rememberVectorPainter(AppIcons.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 podstawowy element
DropdownMenuzawierający 2 pozycje menu. - Parametr
expandedokreśla, czy menu jest rozwinięte czy zwinięte. - Parametr
onDismissRequestdefiniuje wywołanie zwrotne, które jest wykonywane, gdy użytkownik zamknie menu. - Funkcja kompozycyjna
DropdownMenuItemreprezentuje elementy do wyboru w menu. IconButtonpowoduje rozwinięcie i zwinięcie menu.
Wynik
Tworzenie dłuższego menu
Jeśli nie można wyświetlić wszystkich elementów menu naraz, domyślnie można przewijać DropdownMenu. Poniższy fragment kodu tworzy dłuższe, przewijane menu:
@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(painter = rememberVectorPainter(AppIcons.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
- Komponent
DropdownMenumożna przewijać, gdy łączna wysokość jego zawartości przekracza dostępną przestrzeń. Ten kod tworzy przewijany elementDropdownMenu, który wyświetla 100 obiektów zastępczych. - Pętla
forEachdynamicznie generuje elementy kompozycyjneDropdownMenuItem. Elementy nie są tworzone leniwie, co oznacza, że wszystkie 100 elementów menu jest tworzonych i istnieje w kompozycji. - Kliknięcie elementu
IconButtonpowoduje rozwinięcie i zwinięcie elementuDropdownMenu. - Funkcja lambda
onClickw każdym elemencieDropdownMenuItempozwala zdefiniować działanie wykonywane, gdy użytkownik wybierze element menu.
Wynik
Poprzedni fragment kodu generuje to przewijane menu:
Tworzenie dłuższego menu z separatorami
Poniższy fragment kodu pokazuje bardziej zaawansowaną implementację menu. W tym fragmencie kodu do elementów menu dodawane są ikony na początku i na końcu, a grupy elementów menu są rozdzielane separatorami.
@Composable fun DropdownMenuWithDetails() { var expanded by remember { mutableStateOf(false) } Box( modifier = Modifier .fillMaxWidth() .padding(16.dp) ) { IconButton(onClick = { expanded = !expanded }) { Icon(painter = rememberVectorPainter(AppIcons.MoreVert), contentDescription = "More options") } DropdownMenu( expanded = expanded, onDismissRequest = { expanded = false } ) { // First section DropdownMenuItem( text = { Text("Profile") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Person), contentDescription = null) }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Settings") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Settings), contentDescription = null) }, onClick = { /* Do something... */ } ) HorizontalDivider() // Second section DropdownMenuItem( text = { Text("Send Feedback") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Feedback), contentDescription = null) }, trailingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Send), contentDescription = null) }, onClick = { /* Do something... */ } ) HorizontalDivider() // Third section DropdownMenuItem( text = { Text("About") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Info), contentDescription = null) }, onClick = { /* Do something... */ } ) DropdownMenuItem( text = { Text("Help") }, leadingIcon = { Icon(painter = rememberVectorPainter(AppIcons.Help), contentDescription = null) }, trailingIcon = { Icon(painter = rememberVectorPainter(AppIcons.OpenInNew), contentDescription = null) }, onClick = { /* Do something... */ } ) } } }
Ten kod definiuje element DropdownMenu w elemencie Box.
Najważniejsze informacje o kodzie
- Parametry
leadingIconitrailingIcondodają ikony na początku i na końcu elementuDropdownMenuItem. IconButtonpowoduje rozwinięcie menu.DropdownMenuzawiera kilka funkcji kompozycyjnychDropdownMenuItem, z których każda reprezentuje działanie do wyboru.- Komponenty
HorizontalDividerwstawiają poziomą linię, aby oddzielić grupy elementów menu.
Wynik
Powyższy fragment kodu tworzy menu z ikonami i separatorami:
Dodatkowe materiały
- Material Design: menu