I pulsanti con icone mostrano le azioni che gli utenti possono intraprendere. I pulsanti con icone devono utilizzare un'icona con un significato chiaro e in genere rappresentano azioni comuni o usate di frequente.
Esistono due tipi di pulsanti con icone:
- Predefinito: questi pulsanti possono aprire altri elementi, ad esempio un menu o una ricerca.
- Di attivazione/disattivazione: questi pulsanti possono rappresentare azioni binarie che possono essere attivate o disattivate, ad esempio "Preferito" o "Segnalibro".
 
  API surface
Utilizza il composable IconButton per implementare pulsanti con icone standard. Per creare diversi stili visivi, come riempito, tonalità riempita o con contorni, utilizza rispettivamente FilledIconButton, FilledTonalIconButton e OutlinedIconButton.
I parametri chiave per IconButton includono:
- onClick: una funzione lambda che viene eseguita quando l'utente tocca il pulsante dell'icona.
- enabled: un valore booleano che controlla lo stato di attivazione del pulsante. Quando- false, il pulsante non risponde all'input dell'utente.
- content: i contenuti componibili all'interno del pulsante, in genere un- Icon.
Esempio di base: pulsante di attivazione/disattivazione con icona
Questo esempio mostra come implementare un pulsante con icona di attivazione/disattivazione. L'aspetto di un pulsante con icona di attivazione/disattivazione cambia a seconda che sia selezionato o meno.
@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." ) } }
Punti chiave del codice
- Il componibile ToggleIconButtonExampledefinisce unIconButtonattivabile/disattivabile.- mutableStateOf(false)crea un oggetto- MutableStateche contiene un valore booleano, inizialmente- false. In questo modo,- isToggleddiventa un detentore dello stato, il che significa che Compose ricomporrà l'interfaccia utente ogni volta che il relativo valore cambia.
- rememberSaveablegarantisce che lo stato- isToggledpersista anche in seguito alle modifiche di configurazione, come la rotazione dello schermo.
 
- Il lambda onClickdiIconButtondefinisce il comportamento del pulsante quando viene fatto clic, attivando/disattivando lo stato tratrueefalse.
- Il parametro painterdel composableIconcarica condizionatamente unpainterResourcediverso in base allo statoisToggled. In questo modo, l'aspetto dell'icona cambia.- Se isToggledètrue, viene caricato il disegno del cuore pieno.
- Se isToggledèfalse, viene caricato il disegno del cuore con il contorno.
 
- Se 
- Anche il contentDescriptiondelIconsi aggiorna in base allo stato delisToggledper fornire informazioni sull'accessibilità appropriate.
Risultato
L'immagine seguente mostra il pulsante dell'icona di attivazione/disattivazione dello snippet precedente nel suo stato non selezionato:
 
  Esempio avanzato: azioni ripetute con pressione
Questa sezione mostra come creare pulsanti con icone che attivano continuamente un'azione mentre l'utente li preme e li tiene premuti, anziché attivarsi solo una volta per 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, ) } }
Punti chiave del codice
- MomentaryIconButtonaccetta un- unselectedImage: Int, l'ID della risorsa drawable per l'icona quando il pulsante non è premuto, e- selectedImage: Int, l'ID della risorsa drawable per l'icona quando il pulsante è premuto.
- Utilizza un interactionSourceper monitorare specificamente le interazioni di "pressione" dell'utente.
- isPressedè true quando il pulsante è premuto attivamente e false altrimenti. Quando- isPressedè- true,- LaunchedEffectentra in un ciclo.- All'interno di questo ciclo, utilizza un delay(constepDelay) per creare interruzioni tra le azioni di attivazione.coerceIngarantisce che il ritardo sia di almeno 1 ms per evitare cicli infiniti.
- pressedListenerviene invocato dopo ogni ritardo all'interno del loop. In questo modo, l'azione viene ripetuta.
 
- All'interno di questo ciclo, utilizza un 
- pressedListenerutilizza- rememberUpdatedStateper assicurarsi che la funzione lambda- onClick(l'azione da eseguire) sia sempre la più aggiornata dell'ultima composizione.
- L'Iconcambia l'immagine visualizzata in base al fatto che il pulsante sia attualmente premuto o meno.- Se isPressedè true, viene mostratoselectedImage.
- In caso contrario, viene visualizzato unselectedImage.
 
- Se 
A questo punto, utilizza MomentaryIconButton in un esempio. Lo snippet seguente
mostra due pulsanti con icone che controllano un contatore:
@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 } ) } }
Punti chiave del codice
- Il composable MomentaryIconButtonExamplemostra unRowcontenente dueMomentaryIconButtone un composableTextper creare un'interfaccia utente per incrementare e decrementare un contatore.
- Mantiene una variabile di stato mutabile pressedCountutilizzandorememberemutableIntStateOf, inizializzata a 0. QuandopressedCountcambia, tutti i composabili che lo osservano (come il composableText) si ricompono per riflettere il nuovo valore.
- Il primo MomentaryIconButtondiminuiscepressedCountquando viene fatto clic o premuto.
- Il secondo MomentaryIconButtonaumentapressedCountquando viene premuto o tenuto premuto.
- Entrambi i pulsanti utilizzano un stepDelaydi 100 millisecondi, il che significa che l'azioneonClicksi ripete ogni 100 ms mentre un pulsante è premuto.
Risultato
Il video seguente mostra l'interfaccia utente con i pulsanti delle icone e il contatore:
