Оптимизируйте свои подборки
Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Используйте подсказки для добавления контекста к кнопке или другому элементу пользовательского интерфейса. Существует два типа подсказок:
Простые подсказки : описывают элементы или действия кнопок-значков.
Расширенные подсказки : предоставляют более подробную информацию, например, описывают ценность функции. Могут также включать заголовок, ссылку и кнопки (по желанию).
Рисунок 1. Простая подсказка (1) и расширенная подсказка (2).
API поверхность
Вы можете использовать компонуемый элемент TooltipBox для реализации всплывающих подсказок в своём приложении. Внешний вид TooltipBox управляется следующими основными параметрами:
positionProvider : размещает подсказку относительно содержимого якоря. Обычно используется поставщик позиции по умолчанию из TooltipDefaults , или можно указать свой собственный, если требуется особая логика позиционирования.
tooltip : компонуемый элемент, содержащий содержимое подсказки. Обычно используются компонуемые элементы PlainTooltip или RichTooltip .
Используйте PlainTooltip для описания элементов или действий кнопок-значков.
Используйте RichTooltip для предоставления более подробной информации, например, описания ценности функции. Расширенные подсказки могут включать в себя заголовок, ссылку и кнопки (по желанию).
state : держатель состояния, содержащий логику пользовательского интерфейса и состояние элемента для этой подсказки.
content : Компонуемое содержимое, к которому привязана подсказка.
Отобразить простую подсказку
Используйте простую подсказку для краткого описания элемента пользовательского интерфейса. Этот фрагмент кода отображает простую подсказку поверх кнопки со значком «Добавить в избранное»:
@ComposablefunPlainTooltipExample(modifier:Modifier=Modifier,plainTooltipText:String="Add to favorites"){TooltipBox(modifier=modifier,positionProvider=TooltipDefaults.rememberPlainTooltipPositionProvider(),tooltip={PlainTooltip{Text(plainTooltipText)}},state=rememberTooltipState()){IconButton(onClick={/* Do something... */}){Icon(imageVector=Icons.Filled.Favorite,contentDescription="Add to favorites")}}}
При взаимодействии пользователя с IconButton , TooltipBox отображает подсказку с текстом «Добавить в избранное». В зависимости от устройства, подсказку можно вызвать следующими способами:
Наведение курсора на значок
Длительное нажатие на значок на мобильном устройстве
Результат
В этом примере создается простая подсказка поверх значка:
Рисунок 2. Простая подсказка, которая появляется, когда пользователь наводит курсор на значок сердца или удерживает его.
Отобразить расширенную подсказку
Используйте расширенную подсказку для предоставления дополнительного контекста об элементе пользовательского интерфейса. В этом примере создается многострочная расширенная подсказка с заголовком, привязанным к Icon :
@ComposablefunRichTooltipExample(modifier:Modifier=Modifier,richTooltipSubheadText:String="Rich Tooltip",richTooltipText:String="Rich tooltips support multiple lines of informational text."){TooltipBox(modifier=modifier,positionProvider=TooltipDefaults.rememberRichTooltipPositionProvider(),tooltip={RichTooltip(title={Text(richTooltipSubheadText)}){Text(richTooltipText)}},state=rememberTooltipState()){IconButton(onClick={/* Icon button's click event */}){Icon(imageVector=Icons.Filled.Info,contentDescription="Show more information")}}}
TooltipBox обрабатывает прослушиватели событий взаимодействия с пользователем и соответствующим образом обновляет TooltipState . Когда TooltipState указывает на необходимость отображения подсказки, выполняется лямбда-функция tooltip, и TooltipBox отображает RichTooltip . TooltipBox выступает в качестве якоря и контейнера как для содержимого, так и для подсказки.
В данном случае контент представляет собой компонент IconButton , который обеспечивает действие при нажатии. При длительном нажатии (на сенсорных устройствах) или наведении курсора (например, указателя мыши) на любую часть контента TooltipBox отображается подсказка с дополнительной информацией.
Компонуемый объект RichTooltip определяет содержимое подсказки, включая заголовок и основной текст. TooltipDefaults.rememberRichTooltipPositionProvider() предоставляет информацию о позиционировании расширенных подсказок.
Результат
В этом примере создается расширенная подсказка с заголовком, прикрепленным к значку информации:
Рисунок 3. Расширенная подсказка с заголовком и значком информации.
Настройте расширенную подсказку
Этот фрагмент кода отображает расширенную подсказку с заголовком, настраиваемыми действиями и настраиваемым курсором (стрелкой), отображаемым поверх кнопки со значком камеры:
@ComposablefunAdvancedRichTooltipExample(modifier:Modifier=Modifier,richTooltipSubheadText:String="Custom Rich Tooltip",richTooltipText:String="Rich tooltips support multiple lines of informational text.",richTooltipActionText:String="Dismiss"){valtooltipState=rememberTooltipState()valcoroutineScope=rememberCoroutineScope()TooltipBox(modifier=modifier,positionProvider=TooltipDefaults.rememberRichTooltipPositionProvider(),tooltip={RichTooltip(title={Text(richTooltipSubheadText)},action={Row{TextButton(onClick={coroutineScope.launch{tooltipState.dismiss()}}){Text(richTooltipActionText)}}},caretSize=DpSize(32.dp,16.dp)){Text(richTooltipText)}},state=tooltipState){IconButton(onClick={coroutineScope.launch{tooltipState.show()}}){Icon(imageVector=Icons.Filled.Camera,contentDescription="Open camera")}}}
RichToolTip отображает подсказку с заголовком и действием по ее закрытию.
При активации (долгом нажатии или наведении указателя мыши на содержимое ToolTipBox ) подсказка отображается примерно одну секунду. Вы можете скрыть подсказку, коснувшись любого места на экране или нажав кнопку «Скрыть».
При выполнении действия «Отклонить» система запускает сопрограмму для вызова tooltipState.dismiss . Это проверяет, не заблокировано ли выполнение действия во время отображения подсказки.
onClick = coroutineScope.launch { tooltipState.show() } } запускает сопрограмму для ручного отображения подсказки с помощью tooltipState.show .
Параметр action позволяет добавлять в подсказку интерактивные элементы, например кнопку.
Параметр caretSize изменяет размер стрелки подсказки.
Результат
В этом примере получается следующее:
Рисунок 4. Расширенная пользовательская подсказка с действием закрытия, привязанным к значку камеры.
Контент и образцы кода на этой странице предоставлены по лицензиям. Java и OpenJDK – это зарегистрированные товарные знаки корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2025-08-27 UTC.
[null,null,["Последнее обновление: 2025-08-27 UTC."],[],[],null,["Use [tooltips](https://m3.material.io/components/tooltips/overview) to add context to a button or other UI element.\nThere are two types of tooltips:\n\n- **Plain tooltips**: Describe elements or actions of icon buttons.\n- **Rich tooltips**: Provide more detail, such as describing the value of a feature. Can also include an optional title, link, and buttons.\n\n**Figure 1.** A plain tooltip (1) and a rich tooltip (2).\n\nAPI surface\n\nYou can use the [`TooltipBox`](/reference/kotlin/androidx/compose/material3/package-summary#TooltipBox(androidx.compose.ui.window.PopupPositionProvider,kotlin.Function1,androidx.compose.material3.TooltipState,androidx.compose.ui.Modifier,kotlin.Function0,kotlin.Boolean,kotlin.Boolean,kotlin.Function0)) composable to implement tooltips in your app.\nYou control [`TooltipBox`](/reference/kotlin/androidx/compose/material3/package-summary#TooltipBox(androidx.compose.ui.window.PopupPositionProvider,kotlin.Function1,androidx.compose.material3.TooltipState,androidx.compose.ui.Modifier,kotlin.Function0,kotlin.Boolean,kotlin.Boolean,kotlin.Function0)) appearance with these main parameters:\n\n- `positionProvider`: Places the tooltip relative to the anchor content. You typically use a default position provider from the `TooltipDefaults`, or you can provide your own if you need custom positioning logic.\n- `tooltip`: The composable that contains the tooltip's content. You typically use either the `PlainTooltip` or `RichTooltip` composables.\n - Use `PlainTooltip` to describe elements or actions of icon buttons.\n - Use `RichTooltip` to provide more details, like describing the value of a feature. Rich tooltips can include an optional title, link, and buttons.\n- `state`: The state holder that contains the UI logic and element state for this tooltip.\n- `content`: The composable content that the tooltip is anchored to.\n\nDisplay a plain tooltip\n\nUse a plain tooltip to briefly describe a UI element. This code snippet displays\na plain tooltip on top of an icon button, labeled \"Add to favorites\":\n\n\n```kotlin\n@Composable\nfun PlainTooltipExample(\n modifier: Modifier = Modifier,\n plainTooltipText: String = \"Add to favorites\"\n) {\n TooltipBox(\n modifier = modifier,\n positionProvider = TooltipDefaults.rememberPlainTooltipPositionProvider(),\n tooltip = {\n PlainTooltip { Text(plainTooltipText) }\n },\n state = rememberTooltipState()\n ) {\n IconButton(onClick = { /* Do something... */ }) {\n Icon(\n imageVector = Icons.Filled.Favorite,\n contentDescription = \"Add to favorites\"\n )\n }\n }\n}\nhttps://github.com/android/snippets/blob/5673ffc60b614daf028ee936227128eb8c4f9781/compose/snippets/src/main/java/com/example/compose/snippets/components/Tooltips.kt#L74-L95\n```\n\n\u003cbr /\u003e\n\nKey points about the code\n\n- `TooltipBox` generates a tooltip with the text \"Add to favorites\".\n - [`TooltipDefaults.rememberPlainTooltipPositionProvider()`](/reference/kotlin/androidx/compose/material3/TooltipDefaults?#rememberPlainTooltipPositionProvider(androidx.compose.ui.unit.Dp)) provides default positioning for plain tooltips.\n - `tooltip` is a lambda function that defines the tooltip's content using the [`PlainTooltip`](/reference/kotlin/androidx/compose/material3/TooltipScope#(androidx.compose.material3.TooltipScope).PlainTooltip(androidx.compose.ui.Modifier,androidx.compose.ui.unit.DpSize,androidx.compose.ui.unit.Dp,androidx.compose.ui.graphics.Shape,androidx.compose.ui.graphics.Color,androidx.compose.ui.graphics.Color,androidx.compose.ui.unit.Dp,androidx.compose.ui.unit.Dp,kotlin.Function0)) composable.\n - `Text(plainTooltipText)` displays the text within the tooltip.\n - [`tooltipState`](/reference/kotlin/androidx/compose/material3/TooltipState) controls the state of the tooltip.\n- `IconButton` creates a clickable button with an icon.\n - `Icon(...)` displays a heart icon within the button.\n - When a user interacts with the `IconButton`, `TooltipBox` shows the tooltip with the text \"Add to favorites\". Depending on the device, users can trigger the tooltip in the following ways:\n - Hovering over the icon with a cursor\n - Long-pressing the icon on a mobile device\n\nResult\n\nThis example produces a plain tooltip on top of an icon:\n**Figure 2.**A plain tooltip that appears when a user hovers over or long-presses the heart icon.\n\nDisplay a rich tooltip\n\nUse a rich tooltip to provide additional context about a UI element. This\nexample creates a multi-line rich tooltip with a title that is anchored to an\n`Icon`:\n\n\n```kotlin\n@Composable\nfun RichTooltipExample(\n modifier: Modifier = Modifier,\n richTooltipSubheadText: String = \"Rich Tooltip\",\n richTooltipText: String = \"Rich tooltips support multiple lines of informational text.\"\n) {\n TooltipBox(\n modifier = modifier,\n positionProvider = TooltipDefaults.rememberRichTooltipPositionProvider(),\n tooltip = {\n RichTooltip(\n title = { Text(richTooltipSubheadText) }\n ) {\n Text(richTooltipText)\n }\n },\n state = rememberTooltipState()\n ) {\n IconButton(onClick = { /* Icon button's click event */ }) {\n Icon(\n imageVector = Icons.Filled.Info,\n contentDescription = \"Show more information\"\n )\n }\n }\n}https://github.com/android/snippets/blob/5673ffc60b614daf028ee936227128eb8c4f9781/compose/snippets/src/main/java/com/example/compose/snippets/components/Tooltips.kt#L106-L131\n```\n\n\u003cbr /\u003e\n\nKey points about the code\n\n- `TooltipBox` handles the event listeners for user interactions and updates `TooltipState` accordingly. When `TooltipState` indicates that the tooltip should be shown, the tooltip lambda executes, and `TooltipBox` displays the `RichTooltip`. The `TooltipBox` acts as the anchor and container for both content and the tooltip.\n - In this case, the content is an `IconButton` component, which provides the tappable action behavior. When long-pressed (on touch devices) or hovered over (as with the mouse pointer) anywhere in `TooltipBox`'s content, the tooltip will display to show more information.\n- The `RichTooltip` composable defines the tooltip's content, including the title and body text. [`TooltipDefaults.rememberRichTooltipPositionProvider()`](/reference/kotlin/androidx/compose/material3/TooltipDefaults?#rememberRichTooltipPositionProvider(androidx.compose.ui.unit.Dp)) provides positioning information for rich tooltips.\n\nResult\n\nThis example produces a rich tooltip with a title attached to an information\nicon:\n**Figure 3.**A rich tooltip with a title and an information icon.\n\nCustomize a rich tooltip\n\nThis code snippet displays a rich tooltip with a title, custom actions, and a\ncustom caret (arrow) displayed on top of a camera icon button:\n\n\n```kotlin\n@Composable\nfun AdvancedRichTooltipExample(\n modifier: Modifier = Modifier,\n richTooltipSubheadText: String = \"Custom Rich Tooltip\",\n richTooltipText: String = \"Rich tooltips support multiple lines of informational text.\",\n richTooltipActionText: String = \"Dismiss\"\n) {\n val tooltipState = rememberTooltipState()\n val coroutineScope = rememberCoroutineScope()\n\n TooltipBox(\n modifier = modifier,\n positionProvider = TooltipDefaults.rememberRichTooltipPositionProvider(),\n tooltip = {\n RichTooltip(\n title = { Text(richTooltipSubheadText) },\n action = {\n Row {\n TextButton(onClick = {\n coroutineScope.launch {\n tooltipState.dismiss()\n }\n }) {\n Text(richTooltipActionText)\n }\n }\n },\n caretSize = DpSize(32.dp, 16.dp)\n ) {\n Text(richTooltipText)\n }\n },\n state = tooltipState\n ) {\n IconButton(onClick = {\n coroutineScope.launch {\n tooltipState.show()\n }\n }) {\n Icon(\n imageVector = Icons.Filled.Camera,\n contentDescription = \"Open camera\"\n )\n }\n }\n}https://github.com/android/snippets/blob/5673ffc60b614daf028ee936227128eb8c4f9781/compose/snippets/src/main/java/com/example/compose/snippets/components/Tooltips.kt#L142-L187\n```\n\n\u003cbr /\u003e\n\nKey points about the code\n\n- A `RichToolTip` displays a tooltip with a title and dismiss action.\n- When activated, either by a long-press or hovering over the `ToolTipBox` content with the mouse pointer, the tooltip is displayed for about one second. You can dismiss this tooltip by either tapping elsewhere on the screen or using the dismiss action button.\n- When the dismiss action executes, the system launches a coroutine to call `tooltipState.dismiss`. This verifies the action execution isn't blocked while the tooltip is displayed.\n- `onClick = coroutineScope.launch { tooltipState.show() } }` launches a coroutine to manually show the tooltip using `tooltipState.show`.\n- The `action` parameter allows for the adding of interactive elements to a tooltip, such as a button.\n- The `caretSize` parameter modifies the size of the tooltip's arrow.\n\nResult\n\nThis example produces the following:\n**Figure 4.** A custom rich tooltip with a dismiss action anchored to a camera icon.\n\nAdditional resources\n\n- Material Design: [Tooltips](https://m3.material.io/components/tooltips/overview)"]]