Usa un botón segmentado para permitir que los usuarios elijan entre un conjunto de opciones, una al lado de la otra. Existen dos tipos de botones segmentados:
- Botón de selección única: Permite que los usuarios elijan una opción.
- Botón de selección múltiple: Permite que los usuarios elijan entre dos y cinco elementos. Para opciones más complejas o más de cinco elementos, usa chips.
Plataforma de la API
Usa los diseños SingleChoiceSegmentedButtonRow
y MultiChoiceSegmentedButtonRow
para crear botones segmentados. Estos diseños garantizan que los SegmentedButton
se posicionen y tengan el tamaño correcto, y comparten los siguientes parámetros clave:
space
: Ajusta la superposición entre los botones.content
: Contiene el contenido de la fila de botones segmentados, que suele ser una secuencia deSegmentedButton
.
Cómo crear un botón segmentado de selección única
En este ejemplo, se muestra cómo crear un botón segmentado de selección ú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) } ) } } }
Puntos clave sobre el código
- Inicializa una variable
selectedIndex
conremember
ymutableIntStateOf
para hacer un seguimiento del índice de botón seleccionado actualmente. - Define una lista de
options
que representa las etiquetas de los botones. SingleChoiceSegmentedButtonRow
garantiza que solo se pueda seleccionar un botón.- Crea un
SegmentedButton
para cada opción, dentro del bucleforEachIndexed
:shape
define la forma del botón en función de su índice y el recuento total de opciones conSegmentedButtonDefaults.itemShape
.onClick
actualizaselectedIndex
con el índice del botón en el que se hizo clic.selected
establece el estado de selección del botón segúnselectedIndex
.label
muestra la etiqueta del botón con el elemento componibleText
.
Resultado
Crea un botón segmentado de selección múltiple
En este ejemplo, se muestra cómo crear un botón segmentado de varias opciones con íconos que permite a los usuarios seleccionar varias opciones:
@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" ) } } ) } } }
Puntos clave sobre el código
- El código inicializa la variable
selectedOptions
conremember
ymutableStateListOf
. Esto realiza un seguimiento del estado seleccionado de cada botón. - El código usa
MultiChoiceSegmentedButtonRow
para contener los botones. - Dentro del bucle
forEachIndexed
, el código crea unSegmentedButton
para cada opción:shape
define la forma del botón según su índice y el recuento total de opciones.checked
establece el estado de marcado del botón según el valor correspondiente enselectedOptions
.onCheckedChange
activa o desactiva el estado seleccionado del elemento correspondiente enselectedOptions
cuando se hace clic en el botón.icon
muestra un ícono basado enSegmentedButtonDefaults.Icon
y el estado de verificación del botón.label
muestra un ícono que corresponde a la etiqueta, con elementos componiblesIcon
con los vectores de imagen y las descripciones de contenido adecuados.
Resultado
Recursos adicionales
- Material 3: Botones segmentados