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