Сегментированная кнопка

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

  • Кнопка одиночного выбора : позволяет пользователям выбрать один вариант.
  • Кнопка множественного выбора : позволяет пользователям выбирать от двух до пяти элементов. Для более сложного выбора или более пяти предметов используйте фишки .
Показан сегментированный компонент кнопки. Первая кнопка позволяет выбрать один вариант, а вторая кнопка позволяет выбрать несколько вариантов.
Рис. 1. Кнопка однократного выбора (1) и кнопка множественного выбора (2).

поверхность API

Используйте макеты SingleChoiceSegmentedButtonRow и MultiChoiceSegmentedButtonRow для создания сегментированных кнопок. Эти макеты гарантируют правильное расположение и размер SegmentedButton , а также общие следующие ключевые параметры:

  • space : регулирует перекрытие между кнопками.
  • content : Содержит содержимое сегментированной строки кнопки, которая обычно представляет собой последовательность SegmentedButton .

Создайте сегментированную кнопку с одним выбором

В этом примере показано, как создать сегментированную кнопку с одним выбором:

@Composable
fun SingleChoiceSegmentedButton(modifier: Modifier = Modifier) {
    var selectedIndex by remember { mutableIntStateOf(0) }
    val options = listOf("Day", "Month", "Week")

    SingleChoiceSegmentedButtonRow {
        options.forEachIndexed { index, label ->
            SegmentedButton(
                shape = SegmentedButtonDefaults.itemShape(
                    index = index,
                    count = options.size
                ),
                onClick = { selectedIndex = index },
                selected = index == selectedIndex,
                label = { Text(label) }
            )
        }
    }
}

Ключевые моменты о коде

  • Инициализирует переменную selectedIndex используя remember и mutableIntStateOf для отслеживания текущего индекса выбранной кнопки.
  • Определяет список options представляющих метки кнопок.
  • SingleChoiceSegmentedButtonRow гарантирует, что можно выбрать только одну кнопку.
  • Создает SegmentedButton для каждого параметра внутри цикла forEachIndexed :
    • shape определяет форму кнопки на основе ее индекса и общего количества параметров с помощью SegmentedButtonDefaults.itemShape .
    • onClick обновляет selectedIndex индексом нажатой кнопки.
    • selected устанавливает состояние выбора кнопки на основе selectedIndex .
    • label отображает метку кнопки с использованием составного Text .

Результат

Отображается сегментированный компонент кнопки с параметрами «День», «Месяц» и «Неделя». В настоящее время выбран вариант «День».
Рисунок 2. Кнопка одиночного выбора с одним выбранным вариантом.

Создайте сегментированную кнопку с множественным выбором

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

@Composable
fun MultiChoiceSegmentedButton(modifier: Modifier = Modifier) {
    val selectedOptions = remember {
        mutableStateListOf(false, false, false)
    }
    val options = listOf("Walk", "Ride", "Drive")

    MultiChoiceSegmentedButtonRow {
        options.forEachIndexed { index, label ->
            SegmentedButton(
                shape = SegmentedButtonDefaults.itemShape(
                    index = index,
                    count = options.size
                ),
                checked = selectedOptions[index],
                onCheckedChange = {
                    selectedOptions[index] = !selectedOptions[index]
                },
                icon = { SegmentedButtonDefaults.Icon(selectedOptions[index]) },
                label = {
                    when (label) {
                        "Walk" -> Icon(
                            imageVector =
                            Icons.AutoMirrored.Filled.DirectionsWalk,
                            contentDescription = "Directions Walk"
                        )
                        "Ride" -> Icon(
                            imageVector =
                            Icons.Default.DirectionsBus,
                            contentDescription = "Directions Bus"
                        )
                        "Drive" -> Icon(
                            imageVector =
                            Icons.Default.DirectionsCar,
                            contentDescription = "Directions Car"
                        )
                    }
                }
            )
        }
    }
}

Ключевые моменты о коде

  • Код инициализирует переменную selectedOptions используя remember и mutableStateListOf . Это отслеживает выбранное состояние каждой кнопки.
  • В коде используется MultiChoiceSegmentedButtonRow для размещения кнопок.
  • Внутри цикла forEachIndexed код создает SegmentedButton для каждого параметра:
    • shape определяет форму кнопки на основе ее индекса и общего количества опций.
    • checked устанавливает проверенное состояние кнопки на основе соответствующего значения в selectedOptions .
    • onCheckedChange переключает выбранное состояние соответствующего элемента в selectedOptions при нажатии кнопки.
    • icon отображает значок на основе SegmentedButtonDefaults.Icon и проверенного состояния кнопки.
    • label отображает значок, соответствующий метке, используя составные элементы Icon с соответствующими векторами изображений и описаниями содержимого.

Результат

Показан сегментированный компонент кнопки с параметрами «Ходьба», «Езда» и «Движение». Параметры «Ходьба» и «Поездка» в данный момент выбраны.
Рисунок 2. Сегментированная кнопка множественного выбора с двумя выбранными вариантами.

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