Кнопки-значки отображают действия, которые могут выполнять пользователи. Кнопки-значки должны использовать значок с понятным значением и, как правило, представлять общие или часто используемые действия.
Существует два типа кнопок-значков:
- По умолчанию : эти кнопки могут открывать другие элементы, такие как меню или поиск.
- Переключение : эти кнопки могут представлять двоичные действия, которые можно включать и выключать, например, «избранное» или «закладка».

API поверхность
Используйте IconButton composable для реализации стандартных кнопок со значками. Для создания различных визуальных стилей, таких как заполненные, заполненные тонально или обведенные, используйте FilledIconButton , FilledTonalIconButton и OutlinedIconButton соответственно.
Ключевые параметры IconButton включают в себя:
-
onClick: лямбда-функция, которая выполняется, когда пользователь нажимает кнопку со значком. -
enabled: Логическое значение, которое управляет включенным состоянием кнопки. Еслиfalse, кнопка не реагирует на пользовательский ввод. -
content: Компонуемое содержимое внутри кнопки, обычноIcon.
Простой пример: кнопка со значком переключения
В этом примере показано, как реализовать кнопку-переключатель. Кнопка-переключатель меняет свой внешний вид в зависимости от того, выбрана она или нет.
@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." ) } }
Ключевые моменты кодекса
- Компонуемый объект
ToggleIconButtonExampleопределяет переключаемуюIconButton.-
mutableStateOf(false)создает объектMutableState, который содержит логическое значение, изначальноfalse. Это делаетisToggledдержателем состояния, то есть Compose перестраивает пользовательский интерфейс всякий раз, когда его значение изменяется. -
rememberSaveableобеспечивает сохранение состоянияisToggledпри изменении конфигурации, например при повороте экрана.
-
- Лямбда-функция
onClickэлементаIconButtonопределяет поведение кнопки при нажатии, переключая состояние междуtrueиfalse. - Параметр
painterкомпонуемогоIconусловно загружает другойpainterResourceна основе состоянияisToggled. Это изменяет внешний вид значка.- Если
isToggledимеетtrue, загружается закрашенное сердце. - Если
isToggledимеет значениеfalse, загружается выделенное сердце.
- Если
-
contentDescriptionIconтакже обновляется в зависимости от состоянияisToggled, чтобы предоставить соответствующую информацию о доступности.
Результат
На следующем изображении показана кнопка-значок переключения из предыдущего фрагмента в невыбранном состоянии:

Расширенный пример: Повторные действия при нажатии
В этом разделе показано, как создавать кнопки со значками, которые непрерывно запускают действие, пока пользователь нажимает и удерживает их, а не просто запускают его один раз при каждом щелчке.
@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, ) } }
Ключевые моменты кодекса
-
MomentaryIconButtonпринимаетunselectedImage: Int, идентификатор отрисовываемого ресурса для значка, когда кнопка не нажата, иselectedImage: Int, идентификатор отрисовываемого ресурса для значка, когда кнопка нажата. - Он использует
interactionSourceдля отслеживания взаимодействий пользователя с помощью «нажатий». -
isPressedимеет значение true, когда кнопка активно нажимается, и false в противном случае. КогдаisPressedимеет значениеtrue,LaunchedEffectвходит в цикл.- Внутри этого цикла используется
delay(stepDelay) для создания пауз между запускаемыми действиями.coerceInгарантирует, что задержка составит не менее 1 мс, чтобы предотвратить бесконечные циклы. -
pressedListenerвызывается после каждой задержки в цикле. Это заставляет действие повторяться.
- Внутри этого цикла используется
-
pressedListenerиспользуетrememberUpdatedState, чтобы гарантировать, что лямбда-функцияonClick(действие, которое нужно выполнить) всегда является самой актуальной из последней композиции. -
Iconменяет отображаемое изображение в зависимости от того, нажата ли в данный момент кнопка или нет.- Если
isPressedимеет значение true, отображаетсяselectedImage. - В противном случае отображается
unselectedImageизображение.
- Если
Далее, используйте этот MomentaryIconButton в примере. Следующий фрагмент демонстрирует две кнопки-иконки, управляющие счетчиком:
@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 } ) } }
Ключевые моменты кодекса
- Компонуемый элемент
MomentaryIconButtonExampleотображаетRow, содержащую два экземпляраMomentaryIconButton, и компонуемыйTextдля создания пользовательского интерфейса для увеличения и уменьшения счетчика. - Он поддерживает переменную изменяемого состояния
pressedCountс помощьюrememberиmutableIntStateOf, инициализированную значением 0. КогдаpressedCountизменяется, любые компонуемые объекты, наблюдающие за ним (например, компонуемыйText), перестраиваются, чтобы отразить новое значение. - Первая
MomentaryIconButtonуменьшаетpressedCountпри нажатии или удержании. - Вторая
MomentaryIconButtonувеличиваетpressedCountпри нажатии или удержании. - Обе кнопки используют
stepDelayв 100 миллисекунд, что означает, что действиеonClickповторяется каждые 100 мс, пока удерживается кнопка.
Результат
В следующем видео показан пользовательский интерфейс с иконками кнопок и счетчиком: