WindowInsets сообщают приложению, какие части экрана недоступны или требуют особого учета при размещении интерфейса. Это могут быть StatusBar, NavigationBar, экранная клавиатура, вырез камеры, скругленные края дисплея и другие системные или физические ограничения экрана. Без обработки инсетов контент может оказаться перекрыт системным UI, скрыт клавиатурой или выйти за безопасные границы дисплея.
С Android 15 для приложений с targetSdkVersion >= 35 edge-to-edge включается принудительно. Контент теперь занимает весь экран, поэтому разработчик сам должен учитывать инсеты и защищать интерфейс от пересечения с системным UI.
Разрешим контенту рисоваться под системными барами:
class MainActivity: ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent { ... }
}
}
enableEdgeToEdge() устанавливает прозрачный фон системных баров.
Этот метод доступен в артефакте activity:
implementation("androidx.activity:activity-compose")
Все API Window Insets находятся в пакете foundation.layout.
implementation("androidx.compose.foundation:foundation-layout")
Scaffold в Material3 помогает не вникать в обработку инсетов вручную. По умолчанию он получает системные инсеты и передает итоговые отступы в контент через innerPadding. Туда попадают отступы от системного UI, а также пространство, занятое topBar и bottomBar. Поэтому базовое правило, если не хочешь разбираться с инсетами – используй Scaffold как корневой контейнер для каждого экрана и применяй innerPadding к основному контенту.
Scaffold(
topBar = {
TopAppBar()
},
bottomBar = {
NavigationBar {}
}
) { innerPadding ->
LazyColumn(
contentPadding = innerPadding
) {
items(items) { item ->
Item(item)
}
}
}
WindowInsets