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

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

  • Кнопка одиночного выбора : позволяет пользователям выбрать один вариант.
  • Кнопка множественного выбора : позволяет пользователям выбирать от двух до пяти элементов. Для более сложного выбора или выбора более пяти элементов используйте фишки .
Показан компонент сегментированной кнопки. Первая кнопка позволяет выбрать один элемент, а вторая — несколько.
Рисунок 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 с соответствующими векторными изображениями и описаниями содержимого.

Результат

Показан сегментированный компонент кнопки с вариантами «Пешком», «Ездить» и «Водить». В данный момент выбраны варианты «Пешком» и «Ездить».
Рисунок 3. Сегментированная кнопка с возможностью выбора нескольких вариантов.

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