Use um botão segmentado para que os usuários escolham entre um conjunto de opções lado a lado. Há dois tipos de botões segmentados:
- Botão de seleção única: permite que os usuários escolham uma opção.
- Botão de seleção múltipla: permite que os usuários escolham entre dois e cinco itens. Para escolhas mais complexas ou mais de cinco itens, use chips.
Superfície da API
Use os layouts SingleChoiceSegmentedButtonRow e MultiChoiceSegmentedButtonRow para criar botões segmentados. Esses
layouts posicionam e dimensionam os SegmentedButtons corretamente
e compartilham os seguintes parâmetros principais:
space: ajusta a sobreposição entre os botões.content: contém o conteúdo da linha de botões segmentados, que geralmente é uma sequência deSegmentedButtons.
Criar um botão segmentado de seleção única
Este exemplo mostra como criar um botão segmentado de seleção única:
@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) } ) } } }
Pontos principais sobre o código
- Inicializa uma variável
selectedIndexusandorememberemutableIntStateOfpara rastrear o índice do botão selecionado. - Define uma lista de
optionsque representam os rótulos dos botões. SingleChoiceSegmentedButtonRowpermite selecionar apenas um botão.- Cria um
SegmentedButtonpara cada opção dentro do loopforEachIndexed:shapedefine a forma do botão com base no índice e na contagem total de opções usandoSegmentedButtonDefaults.itemShape.onClickatualizaselectedIndexcom o índice do botão clicado.selecteddefine o estado de seleção do botão com base emselectedIndex.- O
labelmostra o rótulo do botão usando o elemento combinávelText.
Resultado
Criar um botão segmentado de seleção múltipla
Este exemplo mostra como criar um botão segmentado de múltipla escolha com ícones que permitem que os usuários selecionem várias opções:
@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" ) } } ) } } }
Pontos principais sobre o código
- O código inicializa a variável
selectedOptionsusandorememberemutableStateListOf. Isso rastreia o estado selecionado de cada botão. - O código usa
MultiChoiceSegmentedButtonRowpara conter os botões. - Dentro do loop
forEachIndexed, o código cria umSegmentedButtonpara cada opção:shapedefine o formato do botão com base no índice e na contagem total de opções.checkeddefine o estado marcado do botão com base no valor correspondente emselectedOptions.onCheckedChangealterna o estado selecionado do item correspondente emselectedOptionsquando o botão é clicado.iconmostra um ícone com base emSegmentedButtonDefaults.Icone no estado marcado do botão.- O
labelmostra um ícone correspondente ao rótulo usando elementos combináveisIconcom vetores de imagem e descrições de conteúdo adequados.
Resultado
Outros recursos
- Material 3: botões segmentados