Раскрывающиеся меню позволяют пользователям щёлкнуть по значку, текстовому полю или другому компоненту, а затем выбрать один из вариантов на временной поверхности. В этом руководстве описывается, как создавать как простые, так и более сложные меню с разделителями и значками.

API поверхность
 Используйте компоненты DropdownMenu , DropdownMenuItem и IconButton для реализации пользовательского раскрывающегося меню. Компоненты DropdownMenu и DropdownMenuItem используются для отображения пунктов меню, а IconButton — это триггер отображения или скрытия раскрывающегося меню.
 Ключевые параметры компонента DropdownMenu включают следующее:
-  
expanded: указывает, видно ли меню. -  
onDismissRequest: используется для обработки закрытия меню. -  
content: The composable content of the menu, typically containingDropdownMenuItemcomposables. 
 Ключевые параметры 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: Меню