Case à cocher

Les cases à cocher permettent aux utilisateurs de sélectionner un ou plusieurs éléments dans une liste. Vous pouvez utiliser une case à cocher pour permettre à l'utilisateur d'effectuer les opérations suivantes :

  • Activer ou désactiver un élément.
  • Sélectionner plusieurs options dans une liste.
  • Indiquer son accord ou son acceptation.

Anatomie

Une case à cocher se compose des éléments suivants :

  • Case : conteneur de la case à cocher.
  • Coche : indicateur visuel indiquant si la case à cocher est sélectionnée ou non.
  • Libellé : texte décrivant la case à cocher.

États

Une case à cocher peut avoir l'un des trois états suivants :

  • Non sélectionnée : la case à cocher n'est pas sélectionnée. La case est vide.
  • Indéterminée : la case à cocher est dans un état indéterminé. La case contient un tiret.
  • Sélectionnée : la case à cocher est sélectionnée. La case contient une coche.

L'image suivante illustre les trois états d'une case à cocher.

Exemple de composant de case à cocher dans chacun de ses trois états : non sélectionné, sélectionné et indéterminé.
Figure 1. Les trois états d'une case à cocher. Non sélectionnée, indéterminée et sélectionnée.

Implémentation

Vous pouvez utiliser le Checkbox composable pour créer une case à cocher dans votre application. Voici quelques paramètres clés à retenir :

  • checked: valeur booléenne indiquant si la case à cocher est cochée ou non.
  • onCheckedChange(): fonction que l'application appelle lorsque l'utilisateur appuie sur la case à cocher.

L'extrait suivant montre comment utiliser le composable 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"
    )
}

Explication

Ce code crée une case à cocher qui n'est pas cochée au départ. Lorsque l'utilisateur clique sur la case à cocher, le lambda onCheckedChange met à jour l'état checked.

Résultat

Cet exemple génère le composant suivant lorsqu'il n'est pas coché :

Case à cocher non cochée avec un libellé. Le texte en dessous indique "La case à cocher n'est pas cochée".
Figure 2. Case à cocher non cochée

Voici comment la même case à cocher apparaît lorsqu'elle est cochée :

Case à cocher cochée avec un libellé. Le texte en dessous indique "La case est cochée".
Figure 3. Case à cocher cochée

Exemple avancé

Voici un exemple plus complexe d'implémentation de cases à cocher dans votre application. Dans cet extrait, une case à cocher parent et une série de cases à cocher enfants sont présentes. Lorsque l'utilisateur appuie sur la case à cocher parent, l'application coche toutes les cases à cocher enfants.

@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")
    }
}

Explication

Voici plusieurs points à noter dans cet exemple :

  • Gestion des états:
    • childCheckedStates: liste de valeurs booléennes utilisant mutableStateOf() pour suivre l'état coché de chaque case à cocher enfant.
    • parentState : ToggleableState dont la valeur dérive des états des cases à cocher enfants.
  • Composants d'interface utilisateur:
    • TriStateCheckbox: nécessaire pour la case à cocher parent, car elle comporte un paramètre state qui vous permet de la définir sur indéterminé.
    • Checkbox: utilisé pour chaque case à cocher enfant, son état étant lié à l'élément correspondant dans childCheckedStates.
    • Text: affiche des libellés et des messages ("Tout sélectionner", "Option X", "Toutes les options sélectionnées").
  • Logique:
    • onClick de la case à cocher parent met à jour toutes les cases à cocher enfants sur l'opposé de l'état parent actuel.
    • onCheckedChange de chaque case à cocher enfant met à jour son état correspondant dans la liste childCheckedStates.
    • Le code affiche "All options selected" lorsque toutes les cases à cocher enfants sont cochées.

Résultat

Cet exemple génère le composant suivant lorsque toutes les cases à cocher sont décochées.

Une série de cases à cocher non cochées avec un libellé.
Figure 4. Cases à cocher non cochées

De même, voici comment le composant apparaît lorsque toutes les options sont cochées, comme lorsque l'utilisateur appuie sur "Tout sélectionner" :

Une série de cases à cocher cochées avec un libellé. La première est marquée "Tout sélectionner". Un composant de texte situé en dessous indique "Toutes les options sélectionnées".
Figure 5. Cases à cocher cochées

Lorsqu'une seule option est cochée, la case à cocher parent affiche l'état indéterminé :

Une série de cases à cocher non cochées avec un libellé. Tous les éléments sont décochés, sauf un. La case à cocher "Tout sélectionner" est indéterminée et affiche un tiret.
Figure 6. Case à cocher indéterminée

Ressources supplémentaires