Раскрывающиеся меню позволяют пользователям щелкнуть значок, текстовое поле или другой компонент, а затем выбрать вариант из списка на временной поверхности. В этом руководстве описывается, как создавать как базовые меню, так и более сложные меню с разделителями и значками.
поверхность API
Используйте DropdownMenu
, DropdownMenuItem
и компоненты IconButton
для реализации настраиваемого раскрывающегося меню. Компоненты DropdownMenu
и DropdownMenuItem
используются для отображения пунктов меню, а IconButton
является триггером для отображения или скрытия раскрывающегося меню.
Ключевые параметры компонента DropdownMenu
включают в себя следующее:
-
expanded
: указывает, отображается ли меню. -
onDismissRequest
: используется для закрытия меню. -
content
: составное содержимое меню, обычно содержащее составные элементыDropdownMenuItem
.
Ключевые параметры DropdownMenuItem
включают следующее:
-
text
: определяет содержимое, отображаемое в пункте меню. -
onClick
: обратный вызов для обработки взаимодействия с элементом в меню.
Создайте базовое раскрывающееся меню
Следующий фрагмент демонстрирует минимальную реализацию 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... */ } ) } } }
Ключевые моменты о коде
- Определяет базовое
DropdownMenu
содержащее два пункта меню. - Параметр
expanded
управляет видимостью меню в развернутом или свернутом виде. - Параметр
onDismissRequest
определяет обратный вызов, который выполняется, когда пользователь закрывает меню. - Составной элемент
DropdownMenuItem
представляет выбираемые элементы в раскрывающемся меню. -
IconButton
запускает раскрытие и свертывание меню.
Результат
Создайте более длинное раскрывающееся меню.
DropdownMenu
по умолчанию прокручивается, если все пункты меню не могут быть отображены одновременно. Следующий фрагмент создает более длинное раскрывающееся меню с возможностью прокрутки:
@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... */ } ) } } } }
Ключевые моменты о коде
-
DropdownMenu
можно прокручивать, когда общая высота его содержимого превышает доступное пространство. Этот код создает прокручиваемоеDropdownMenu
, в котором отображаются 100 элементов-заполнителей. - Цикл
forEach
динамически генерирует составные элементыDropdownMenuItem
. Элементы не создаются лениво, что означает, что все 100 элементов раскрывающегося списка создаются и существуют в композиции. -
IconButton
запускает раскрытие и свертываниеDropdownMenu
при нажатии. - Лямбда-выражение
onClick
в каждомDropdownMenuItem
позволяет определить действие, выполняемое, когда пользователь выбирает пункт меню.
Результат
Предыдущий фрагмент кода создает следующее прокручиваемое меню:
Создайте более длинное раскрывающееся меню с разделителями.
В следующем фрагменте показана более продвинутая реализация раскрывающегося меню. В этом фрагменте к пунктам меню добавляются ведущие и конечные значки, а группы пунктов меню разделяются разделителями.
@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... */ } ) } } }
Этот код определяет DropdownMenu
внутри Box
.
Ключевые моменты о коде
- Параметры
leadingIcon
иtrailingIcon
добавляют значки в начало и конецDropdownMenuItem
. -
IconButton
запускает расширение меню. -
DropdownMenu
содержит несколько составных элементовDropdownMenuItem
, каждый из которых представляет выбираемое действие. - Составные элементы
HorizontalDivider
вставляют горизонтальную линию для разделения групп пунктов меню.
Результат
Предыдущий фрагмент создает раскрывающееся меню со значками и разделителями:
Дополнительные ресурсы
- Материальный дизайн: меню