WindowInsets сообщают приложению, какие части экрана недоступны или требуют особого учета при размещении интерфейса. Это могут быть StatusBar, NavigationBar, экранная клавиатура, вырез камеры, скругленные края дисплея и другие системные или физические ограничения экрана. Без обработки инсетов контент может оказаться перекрыт системным UI, скрыт клавиатурой или выйти за безопасные границы дисплея.

С Android 15 для приложений с targetSdkVersion >= 35 edge-to-edge включается принудительно. Контент теперь занимает весь экран, поэтому разработчик сам должен учитывать инсеты и защищать интерфейс от пересечения с системным UI.

Включить edge-to-edge

Разрешим контенту рисоваться под системными барами:

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 и инсеты

Scaffold в Material3 помогает не вникать в обработку инсетов вручную. По умолчанию он получает системные инсеты и передает итоговые отступы в контент через innerPadding. Туда попадают отступы от системного UI, а также пространство, занятое topBar и bottomBar. Поэтому базовое правило, если не хочешь разбираться с инсетами – используй Scaffold как корневой контейнер для каждого экрана и применяй innerPadding к основному контенту.

Scaffold(
    topBar = {
        TopAppBar()
    },
    bottomBar = {
        NavigationBar {}
    }
) { innerPadding ->
    LazyColumn(
        contentPadding = innerPadding
    ) {
        items(items) { item ->
            Item(item)
        }
    }
}

Отключение инсетов в Scaffold

Интерфейс WindowInsets