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

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

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

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

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

  • 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 с соответствующими векторами изображений и описаниями содержимого.

Результат

Показан сегментированный компонент кнопки с опциями Walk, Ride и Drive. В данный момент выбраны опции Walk и Ride.
Рисунок 2. Сегментированная кнопка с возможностью множественного выбора и двумя выбранными вариантами.

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