Меню

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

A Раскрывающееся меню с двумя отображаемыми опциями. Значок с тремя вертикальными точками указывает, что нажатие на него открывает меню.
Рисунок 1. Простое раскрывающееся меню с двумя перечисленными пунктами.

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 активирует развертывание и сворачивание меню.

Результат

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

Создайте более длинное выпадающее меню

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 composables. Элементы не создаются лениво, что означает, что все 100 раскрывающихся элементов создаются и существуют в композиции.
  • При нажатии на иконку IconButton происходит развертывание и сворачивание DropdownMenu .
  • Лямбда-функция onClick в каждом DropdownMenuItem позволяет определить действие, выполняемое при выборе пользователем элемента меню.

Результат

Предыдущий фрагмент кода создает следующее прокручиваемое меню:

Раскрывающееся меню со множеством опций, требующее прокрутки для просмотра всех пунктов.
Рисунок 3. Длинное прокручиваемое раскрывающееся меню.

Создайте более длинное выпадающее меню с разделителями

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

@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 вставляют горизонтальную линию для разделения групп пунктов меню.

Результат

Предыдущий фрагмент создает раскрывающееся меню со значками и разделителями:

Раскрывающееся меню с разделами «Профиль», «Настройки», «Отправить отзыв», «О нас» и
Рисунок 4. Раскрывающееся меню, разделенное на разделы с начальными и конечными значками.

Дополнительные ресурсы

  • Материальный дизайн: меню