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

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
, загружается выделенное сердце.
- Если
-
contentDescription
Icon
также обновляется в зависимости от состояния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 мс, пока удерживается кнопка.
Результат
В следующем видео показан пользовательский интерфейс с иконками кнопок и счетчиком: