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 :

  • Activez ou désactivez un élément.
  • Sélectionnez une ou plusieurs options dans une liste.
  • Indiquez que vous êtes d'accord ou que vous acceptez.

Anatomie

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

  • Box : conteneur de la case à cocher.
  • Coche : indicateur visuel qui indique si la case est coché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 n'est pas cochée. La boîte est vide.
  • Indéterminé : la case à cocher est dans un état indéterminé. La boîte contient un tiret.
  • Sélectionné : la case est cochée. La case contient une coche.

L'image suivante montre 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é, indéterminé et sélectionné.

Implémentation

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

  • checked : valeur booléenne indiquant si la case 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 est initialement décochée. Lorsque l'utilisateur coche la case, 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 n'est pas cochée".
Figure 2. Case à cocher non cochée

Voici à quoi ressemble la même case à cocher 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 cochée

Exemple avancé

Voici un exemple plus complexe d'implémentation de cases à cocher dans votre application. Dans cet extrait, il existe une case à cocher parent et une série de cases à cocher enfants. Lorsque l'utilisateur appuie sur la case à cocher parente, 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 quelques points à noter dans cet exemple :

  • Gestion de l'état :
    • childCheckedStates : liste de valeurs booléennes utilisant mutableStateOf() pour suivre l'état coché de chaque case à cocher enfant.
    • parentState : ToggleableState dont la valeur est dérivée de l'état des cases à cocher enfants.
  • Composants de l'UI :
    • TriStateCheckbox : nécessaire pour la case à cocher parente, car elle comporte un paramètre state qui permet de la définir sur "indéterminée".
    • Checkbox : utilisé pour chaque case à cocher enfant dont l'état est lié à l'élément correspondant dans childCheckedStates.
    • Text : affiche les libellés et les messages ("Tout sélectionner", "Option X", "Toutes les options sélectionnées").
  • Logique :
    • La case à cocher parente onClick met à jour toutes les cases à cocher enfants sur l'état opposé à celui de la case parente actuelle.
    • La onCheckedChange de chaque case à cocher enfant met à jour l'état correspondant dans la liste childCheckedStates.
    • Le code affiche "All options selected" lorsque toutes les cases 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 décochées

De même, voici comment le composant s'affiche 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 textuel situé en dessous indique "Toutes les options sélectionnées".
Figure 5 : Cases cochées

Lorsque seule une option est cochée, la case à cocher parente 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