Раскрывающиеся меню позволяют пользователям нажимать на значок, текстовое поле или другой компонент, а затем выбирать один из вариантов в списке на временной поверхности. В этом руководстве рассказывается, как создавать простые и сложные меню с разделителями и значками.
Поверхность API
Используйте компоненты DropdownMenu, DropdownMenuItem и IconButton, чтобы реализовать собственное раскрывающееся меню. Компоненты DropdownMenu и DropdownMenuItem используются для отображения пунктов меню, а IconButton – для показа или скрытия раскрывающегося меню.
Основные параметры компонента DropdownMenu:
expanded– указывает, видно ли меню.onDismissRequest: используется для закрытия меню.content– составной контент меню, обычно содержащий composable-функции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вставляют горизонтальную линию, чтобы разделить группы пунктов меню.
Результат
Приведенный выше фрагмент кода создает раскрывающееся меню со значками и разделителями:
Дополнительные ресурсы
- Material Design: меню