Le caselle di controllo consentono agli utenti di selezionare uno o più elementi da un elenco. Puoi utilizzare una casella di controllo per consentire all'utente di eseguire le seguenti operazioni:
- Attiva o disattiva un elemento.
- Seleziona da più opzioni in un elenco.
- Indicare il consenso o l'accettazione.
Anatomia
Una casella di controllo è costituita dai seguenti elementi:
- Box: questo è il contenitore della casella di controllo.
- Verifica: si tratta dell'indicatore visivo che mostra se la casella di controllo è selezionata o meno.
- Etichetta: è il testo che descrive la casella di controllo.
Stati
Una casella di controllo può avere uno dei tre seguenti stati:
- Deselezionato: la casella di controllo non è selezionata. La casella è vuota.
- Indeterminato: la casella di controllo è in uno stato indeterminato. che contiene un trattino.
- Selezionati: la casella di controllo è selezionata. La casella contiene un segno di spunta.
L'immagine seguente mostra i tre stati di una casella di controllo.
Implementazione
Puoi utilizzare il componibile Checkbox
per creare una casella di controllo nella tua app.
Tieni presente solo alcuni parametri chiave:
checked
: il valore booleano che registra se la casella di controllo è selezionata o meno.onCheckedChange()
: la funzione chiamata dall'app quando l'utente tocca la casella di controllo.
Il seguente snippet mostra come utilizzare l'elemento componibile Checkbox
:
@Composable fun CheckboxMinimalExample() { var checked by remember { mutableStateOf(true) } Row( verticalAlignment = Alignment.CenterVertically, ) { Text( "Minimal checkbox" ) Checkbox( checked = checked, onCheckedChange = { checked = it } ) } Text( if (checked) "Checkbox is checked" else "Checkbox is unchecked" ) }
Spiegazione
Questo codice crea una casella di controllo che inizialmente è deselezionata. Quando l'utente fa clic sulla casella di controllo, il lambda onCheckedChange
aggiorna lo stato checked
.
Risultato
Se deselezionata, questo esempio produce il seguente componente:
![Una casella di controllo non selezionata con un'etichetta. Il testo sotto è "La casella di controllo è deselezionata".](https://developer.android.com/static/develop/ui/compose/images/components/checkbox-minimal-unchecked.png?hl=it)
Ecco come appare la stessa casella di controllo quando viene selezionata:
![Una casella di controllo selezionata con un'etichetta. Sotto il testo è presente la dicitura "La casella di controllo è selezionata".](https://developer.android.com/static/develop/ui/compose/images/components/checkbox-minimal-checked.png?hl=it)
Esempio avanzato
Di seguito è riportato un esempio più complesso di come implementare le caselle di controllo nell'app. In questo snippet sono presenti una casella di controllo principale e una serie di caselle di controllo secondarie. Quando l'utente tocca la casella di controllo principale, l'app seleziona tutte le caselle di controllo secondarie.
@Composable fun CheckboxParentExample() { // Initialize states for the child checkboxes val childCheckedStates = remember { mutableStateListOf(false, false, false) } // Compute the parent state based on children's states val parentState = when { childCheckedStates.all { it } -> ToggleableState.On childCheckedStates.none { it } -> ToggleableState.Off else -> ToggleableState.Indeterminate } Column { // Parent TriStateCheckbox Row( verticalAlignment = Alignment.CenterVertically, ) { Text("Select all") TriStateCheckbox( state = parentState, onClick = { // Determine new state based on current state val newState = parentState != ToggleableState.On childCheckedStates.forEachIndexed { index, _ -> childCheckedStates[index] = newState } } ) } // Child Checkboxes childCheckedStates.forEachIndexed { index, checked -> Row( verticalAlignment = Alignment.CenterVertically, ) { Text("Option ${index + 1}") Checkbox( checked = checked, onCheckedChange = { isChecked -> // Update the individual child state childCheckedStates[index] = isChecked } ) } } } if (childCheckedStates.all { it }) { Text("All options selected") } }
Spiegazione
Di seguito sono riportati alcuni punti da tenere presenti in questo esempio:
- Gestione degli stati:
childCheckedStates
: un elenco di valori booleani che utilizzanomutableStateOf()
per monitorare lo stato selezionato di ogni casella di controllo secondaria.parentState
: una classeToggleableState
il cui valore deriva dagli stati delle caselle di controllo secondarie.
- Componenti UI:
TriStateCheckbox
: è necessaria per la casella di controllo principale in quanto ha un parametrostate
che ti consente di impostarlo come indeterminato.Checkbox
: utilizzato per ogni casella di controllo secondaria con il relativo stato collegato all'elemento corrispondente inchildCheckedStates
.Text
: mostra etichette e messaggi ("Seleziona tutto", "Opzione X", "Tutte le opzioni selezionate").
- Logica:
- La casella di controllo principale
onClick
aggiorna tutte le caselle di controllo secondarie al contrario dello stato principale corrente. onCheckedChange
di ogni casella di controllo secondaria aggiorna lo stato corrispondente nell'elencochildCheckedStates
.- Il codice visualizza "
All options selected
" quando tutte le caselle di controllo figlio sono selezionate.
- La casella di controllo principale
Risultato
Questo esempio produce il seguente componente quando tutte le caselle di controllo sono deselezionate.
![Una serie di caselle di controllo etichettate non selezionate con un'etichetta.](https://developer.android.com/static/develop/ui/compose/images/components/checkbox-parent-unchecked.png?hl=it)
Allo stesso modo, questo è l'aspetto del componente quando tutte le opzioni sono selezionate, ad esempio quando l'utente tocca Seleziona tutto:
![Una serie di caselle di controllo contrassegnate da etichette con un'etichetta. Il primo è contrassegnato come "Seleziona tutto". Sotto di essi è presente un componente di testo con la dicitura "Tutte le opzioni selezionate".](https://developer.android.com/static/develop/ui/compose/images/components/checkbox-parent-checked.png?hl=it)
Quando è selezionata una sola opzione, la casella di controllo principale mostra lo stato indeterminato:
![Una serie di caselle di controllo etichettate deselezionate con un'etichetta. Tutte tranne una sono deselezionate. La casella di controllo "Seleziona tutto" è indeterminata e mostra un trattino.](https://developer.android.com/static/develop/ui/compose/images/components/checkbox-parent-indeterminate.png?hl=it)