Чтобы предоставить приложению полный контроль над отображением контента, выполните следующие действия. Без них приложение может отображать чёрный или сплошной цвет за системным пользовательским интерфейсом или не синхронизировать анимацию с виртуальной клавиатурой.
- Для обеспечения безрамочного отображения на устройствах Android 15 и выше используйте Android 15 (уровень API 35) или более поздней версии. Ваше приложение отображается за системным пользовательским интерфейсом. Вы можете настроить пользовательский интерфейс приложения, используя вставки.
- При желании можно вызвать
enableEdgeToEdge()
вActivity.onCreate()
, что позволит вашему приложению работать от края до края на предыдущих версиях Android. Установите
android:windowSoftInputMode="adjustResize"
в записиAndroidManifest.xml
вашей Activity. Этот параметр позволяет вашему приложению получать размер программного редактора метода ввода (IME) в виде вставок, что помогает применять правильную компоновку и отступы при появлении и исчезновении IME в вашем приложении.<!-- In your AndroidManifest.xml file: --> <activity android:name=".ui.MainActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.MyApplication" android:exported="true">
Используйте API Compose
После того, как ваша Activity возьмёт на себя управление всеми вставками, вы сможете использовать API Compose, чтобы гарантировать, что контент не будет перекрыт, а интерактивные элементы не будут перекрываться системным пользовательским интерфейсом. Эти API также синхронизируют макет вашего приложения с изменениями вставок.
Например, это самый простой метод применения вставок к содержимому всего вашего приложения:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { Box(Modifier.safeDrawingPadding()) { // the rest of the app } } }
Этот фрагмент кода применяет отступы окна safeDrawing
в качестве отступов вокруг всего содержимого приложения. Это гарантирует, что интерактивные элементы не будут перекрывать системный интерфейс, но при этом ни одно приложение не будет отрисовываться за ним, создавая эффект «от края до края». Чтобы полностью использовать всё окно, необходимо точно настроить, где отступы применяются на каждом экране или на каждом компоненте.
Все эти типы вставок автоматически анимируются с помощью анимации IME, перенесенной в API 21. Соответственно, все ваши макеты, использующие эти вставки, также автоматически анимируются при изменении значений вставок.
Существует два основных способа использования этих типов вставок для настройки компонуемых макетов: модификаторы отступов и модификаторы размера вставок.
Модификаторы заполнения
Modifier.windowInsetsPadding(windowInsets: WindowInsets)
применяет заданные отступы окна в качестве отступов, действуя аналогично Modifier.padding
. Например, Modifier.windowInsetsPadding(WindowInsets.safeDrawing)
применяет безопасные отступы рисования в качестве отступов со всех четырёх сторон.
Существует также несколько встроенных вспомогательных методов для наиболее распространённых типов вставок. Один из таких методов — Modifier.safeDrawingPadding()
, эквивалентный Modifier.windowInsetsPadding(WindowInsets.safeDrawing)
. Аналогичные модификаторы существуют и для других типов вставок.
Модификаторы размера вставки
Следующие модификаторы применяют количество вставок окна, устанавливая размер компонента равным размеру вставок:
Применяет начальную сторону windowInsets в качестве ширины (как | |
Применяет конечную сторону windowInsets в качестве ширины (как | |
Применяет верхнюю сторону windowInsets в качестве высоты (как | |
| Применяет нижнюю сторону windowInsets в качестве высоты (как |
Эти модификаторы особенно полезны для определения размера Spacer
, занимающего пространство вставок:
LazyColumn( Modifier.imePadding() ) { // Other content item { Spacer( Modifier.windowInsetsBottomHeight( WindowInsets.systemBars ) ) } }
Вставное потребление
Модификаторы отступов ( windowInsetsPadding
и вспомогательные методы, такие как safeDrawingPadding
) автоматически используют ту часть отступов, которая применяется в качестве отступа. При более глубоком анализе дерева композиции вложенные модификаторы отступов и модификаторы размера отступов учитывают, что часть отступов уже занята внешними модификаторами отступов, и избегают повторного использования одной и той же части отступов, что привело бы к избыточному лишнему пространству.
Модификаторы размера вставок также позволяют избежать повторного использования одной и той же части вставок, если вставки уже были использованы. Однако, поскольку они напрямую изменяют свой размер, сами вставки они не используют.
В результате вложенные модификаторы отступов автоматически изменяют величину отступа, применяемого к каждому компонуемому элементу.
Рассмотрим тот же пример LazyColumn
, что и раньше: размер LazyColumn
изменяется модификатором imePadding
. Внутри LazyColumn
последний элемент изменяется по высоте нижней части системных панелей:
LazyColumn( Modifier.imePadding() ) { // Other content item { Spacer( Modifier.windowInsetsBottomHeight( WindowInsets.systemBars ) ) } }
Когда редактор метода ввода (IME) закрыт, модификатор imePadding()
не применяет отступы, поскольку у редактора метода ввода (IME) нет высоты. Поскольку модификатор imePadding()
не применяет отступы, отступы не используются, а высота элемента Spacer
будет равна размеру нижней стороны системных панелей.
При открытии редактора метода ввода (IME) отступы IME анимируются, подстраиваясь под его размер, а модификатор imePadding()
начинает применять нижний отступ, изменяя размер LazyColumn
при открытии редактора метода ввода. Когда модификатор imePadding()
начинает применять нижний отступ, он также начинает использовать этот отступ. Таким образом, высота элемента Spacer
начинает уменьшаться, поскольку часть отступа для системных панелей уже была применена модификатором imePadding()
. Как только модификатор imePadding()
применяет нижний отступ, превышающий системные панели, высота элемента Spacer
становится равной нулю.
Когда IME закрывается, изменения происходят в обратном порядке: Spacer
начинает расширяться с высоты нуля, как только imePadding()
применяется меньше, чем нижняя сторона системных панелей, пока, наконец, Spacer
не совпадет с высотой нижней стороны системных панелей, как только IME полностью скроется.
TextField
. Такое поведение достигается посредством взаимодействия между всеми модификаторами windowInsetsPadding
и может быть изменено несколькими другими способами.
Modifier.consumeWindowInsets(insets: WindowInsets)
также использует вставки таким же образом, как Modifier.windowInsetsPadding
, но не применяет их в качестве отступов. Это полезно в сочетании с модификаторами размера вставок, чтобы указать родственным элементам, что определённое количество вставок уже использовано:
Column(Modifier.verticalScroll(rememberScrollState())) { Spacer(Modifier.windowInsetsTopHeight(WindowInsets.systemBars)) Column( Modifier.consumeWindowInsets( WindowInsets.systemBars.only(WindowInsetsSides.Vertical) ) ) { // content Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime)) } Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.systemBars)) }
Modifier.consumeWindowInsets(paddingValues: PaddingValues)
ведёт себя очень похоже на версию с аргументом WindowInsets
, но принимает произвольное значение PaddingValues
для использования. Это полезно для информирования дочерних элементов, когда отступы или интервалы обеспечиваются другим механизмом, нежели модификаторами вставного отступа, например, обычным Modifier.padding
или спейсерами фиксированной высоты:
Column(Modifier.padding(16.dp).consumeWindowInsets(PaddingValues(16.dp))) { // content Spacer(Modifier.windowInsetsBottomHeight(WindowInsets.ime)) }
Если требуются необработанные отступы окон без учёта потребления, используйте значения WindowInsets
напрямую или используйте WindowInsets.asPaddingValues()
для возврата значений PaddingValues
отступов, не затронутых потреблением. Однако, учитывая следующие оговорки, предпочтительнее использовать модификаторы заполнения и размера отступов окон везде, где это возможно.
Вставки и фазы создания реактивного ранца
Compose использует базовые API ядра AndroidX для обновления и анимации вставок, которые, в свою очередь, используют базовые API платформы, управляющие вставками. В связи с этим поведением платформы вставки имеют особую связь с фазами Jetpack Compose .
Значения вставок обновляются после фазы композиции, но до фазы макета. Это означает, что при чтении значений вставок в композиции обычно используется значение вставок, отстающее на один кадр. Встроенные модификаторы, описанные на этой странице, предназначены для задержки использования значений вставок до фазы макета, что гарантирует использование значений вставок в том же кадре, в котором они обновляются.