Les boutons avec icône affichent les actions que les utilisateurs peuvent effectuer. Les boutons à icônes doivent utiliser une icône dont la signification est claire et représentent généralement des actions courantes ou fréquemment utilisées.
Il existe deux types de boutons d'icône:
- Par défaut: ces boutons peuvent ouvrir d'autres éléments, comme un menu ou une recherche.
- Boutons d'activation/de désactivation: ces boutons peuvent représenter des actions binaires pouvant être activées ou désactivées, comme "Favoris" ou "Ajouter aux favoris".

Surface d'API
Utilisez le composable IconButton
pour implémenter des boutons d'icônes standards. Pour créer différents styles visuels, comme rempli, rempli avec tonalité ou contourné, utilisez FilledIconButton
, FilledTonalIconButton
et OutlinedIconButton
, respectivement.
Voici les principaux paramètres de IconButton
:
onClick
: fonction lambda qui s'exécute lorsque l'utilisateur appuie sur le bouton de l'icône.enabled
: valeur booléenne qui contrôle l'état d'activation du bouton. Lorsquefalse
, le bouton ne répond pas à l'entrée utilisateur.content
: contenu composable dans le bouton, généralement unIcon
.
Exemple de base: Bouton d'icône d'activation/de désactivation
Cet exemple montre comment implémenter un bouton d'icône d'activation/de désactivation. Un bouton d'icône d'activation/de désactivation change d'apparence selon qu'il est sélectionné ou non.
@Preview @Composable fun ToggleIconButtonExample() { // isToggled initial value should be read from a view model or persistent storage. var isToggled by rememberSaveable { mutableStateOf(false) } IconButton( onClick = { isToggled = !isToggled } ) { Icon( painter = if (isToggled) painterResource(R.drawable.favorite_filled) else painterResource(R.drawable.favorite), contentDescription = if (isToggled) "Selected icon button" else "Unselected icon button." ) } }
Points clés concernant le code
- Le composable
ToggleIconButtonExample
définit unIconButton
activable/désactivable.mutableStateOf(false)
crée un objetMutableState
qui contient une valeur booléenne, initialementfalse
.isToggled
devient ainsi un conteneur d'état, ce qui signifie que Compose recompose l'UI chaque fois que sa valeur change.rememberSaveable
garantit que l'étatisToggled
persiste en cas de modification de la configuration, comme la rotation de l'écran.
- Le lambda
onClick
deIconButton
définit le comportement du bouton lorsqu'il est cliqué, en basculant l'état entretrue
etfalse
. - Le paramètre
painter
du composableIcon
charge de manière conditionnelle unpainterResource
différent en fonction de l'étatisToggled
. Cela modifie l'apparence visuelle de l'icône.- Si
isToggled
est défini surtrue
, il charge le drawable en forme de cœur rempli. - Si
isToggled
estfalse
, il charge le drawable de cœur en contour.
- Si
- Le
contentDescription
de laIcon
est également mis à jour en fonction de l'état de laisToggled
pour fournir des informations d'accessibilité appropriées.
Résultat
L'image suivante montre le bouton d'icône d'activation/de désactivation de l'extrait de code précédent dans son état non sélectionné:

Exemple avancé: Actions répétées en appuyant sur un bouton
Cette section explique comment créer des boutons d'icône qui déclenchent une action en continu lorsque l'utilisateur appuie dessus et les maintient, plutôt que de les déclencher une seule fois par clic.
@Composable fun MomentaryIconButton( unselectedImage: Int, selectedImage: Int, contentDescription: String, modifier: Modifier = Modifier, stepDelay: Long = 100L, // Minimum value is 1L milliseconds. onClick: () -> Unit ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() val pressedListener by rememberUpdatedState(onClick) LaunchedEffect(isPressed) { while (isPressed) { delay(stepDelay.coerceIn(1L, Long.MAX_VALUE)) pressedListener() } } IconButton( modifier = modifier, onClick = onClick, interactionSource = interactionSource ) { Icon( painter = if (isPressed) painterResource(id = selectedImage) else painterResource(id = unselectedImage), contentDescription = contentDescription, ) } }
Points clés concernant le code
MomentaryIconButton
prend ununselectedImage: Int
, l'ID de ressource drawable de l'icône lorsque le bouton n'est pas enfoncé, etselectedImage: Int
, l'ID de ressource drawable de l'icône lorsque le bouton est enfoncé.- Il utilise un
interactionSource
pour suivre spécifiquement les interactions de pression de l'utilisateur. isPressed
est défini sur "true" lorsque le bouton est enfoncé et sur "false" dans le cas contraire. LorsqueisPressed
esttrue
,LaunchedEffect
entre dans une boucle.- Dans cette boucle, il utilise un
delay
(avecstepDelay
) pour créer des pauses entre les actions de déclenchement.coerceIn
s'assure que le délai est d'au moins 1 ms pour éviter les boucles infinies. pressedListener
est appelé après chaque délai dans la boucle. L'action est alors répétée.
- Dans cette boucle, il utilise un
pressedListener
utiliserememberUpdatedState
pour s'assurer que le lambdaonClick
(l'action à effectuer) est toujours le plus à jour depuis la dernière composition.Icon
modifie l'image affichée selon que le bouton est actuellement enfoncé ou non.- Si
isPressed
est "true",selectedImage
est affiché. - Sinon, l'
unselectedImage
s'affiche.
- Si
Utilisez ensuite cette MomentaryIconButton
dans un exemple. L'extrait de code suivant illustre deux boutons d'icônes contrôlant un compteur:
@Preview() @Composable fun MomentaryIconButtonExample() { var pressedCount by remember { mutableIntStateOf(0) } Row( modifier = Modifier.fillMaxWidth(), verticalAlignment = Alignment.CenterVertically ) { MomentaryIconButton( unselectedImage = R.drawable.fast_rewind, selectedImage = R.drawable.fast_rewind_filled, stepDelay = 100L, onClick = { pressedCount -= 1 }, contentDescription = "Decrease count button" ) Spacer(modifier = Modifier) Text("advanced by $pressedCount frames") Spacer(modifier = Modifier) MomentaryIconButton( unselectedImage = R.drawable.fast_forward, selectedImage = R.drawable.fast_forward_filled, contentDescription = "Increase count button", stepDelay = 100L, onClick = { pressedCount += 1 } ) } }
Points clés concernant le code
- Le composable
MomentaryIconButtonExample
affiche unRow
contenant deux instancesMomentaryIconButton
et un composableText
pour créer une UI permettant d'incrémenter et de décrémenter un compteur. - Il conserve une variable d'état modifiable
pressedCount
à l'aide deremember
etmutableIntStateOf
, initialisée à 0. LorsquepressedCount
change, tous les composables qui l'observent (comme le composableText
) se recomposent pour refléter la nouvelle valeur. - Le premier
MomentaryIconButton
diminuepressedCount
lorsque vous cliquez dessus ou le maintenez enfoncé. - Le deuxième
MomentaryIconButton
augmentepressedCount
lorsqu'il est cliqué ou maintenu. - Les deux boutons utilisent un
stepDelay
de 100 millisecondes, ce qui signifie que l'actiononClick
se répète toutes les 100 millisecondes lorsqu'un bouton est maintenu enfoncé.
Résultat
La vidéo suivante montre l'interface utilisateur avec les boutons d'icône et le compteur: