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

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

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

API surface

Используйте макеты 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 показывает значок, соответствующий ярлыку, используя composable-функции Icon с подходящими векторными изображениями и описаниями контента.

Результат

Показан компонент сегментированной кнопки с вариантами "Пешком", "На велосипеде" и "На автомобиле". Выбраны варианты "Пешком" и "На транспорте".
Рисунок 3. Сегментированная кнопка с множественным выбором, на которой выбрано два варианта.

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