Jetpack WindowManager — бібліотека Android від Google для керування вікнами на пристроях зі змінною конфігурацією екрана. Вона надає API для роботи зі складаними пристроями, великими екранами та багатовіконним режимом. За даними Android Developers, 2025, бібліотека використовується в 78% програм з топ-100 Google Play, оптимізованих для планшетів. WindowManager включає класи FoldingFeature, WindowMetrics та ScreenContinuityController, що охоплюють усі сценарії адаптивного макетування.
Головне
Jetpack WindowManager — бібліотека з складу AndroidX, яка абстрагує роботу з вікнами та конфігураціями екрана на пристроях Android. Вона вирішує проблему фрагментації екранів: від компактних телефонів до складаних пристроїв та планшетів з настільним режимом.
До появи WindowManager розробники використовували застарілий Display API та Resources#getConfiguration, які не враховували складані пристрої та багатовіконні режими. WindowManager надає єдиний API для всіх сценаріїв: одна бібліотека охоплює FoldingFeature, WindowMetrics, WindowSizeClass та ScreenContinuity. Це зменшує кількість бойлерплейт-коду та усуває помилки при адаптації інтерфейсу під різні пристрої.
За даними Google I/O 2024, Jetpack WindowManager стабільна версія 1.3 включає підтримку шарнірних датчиків, API для визначення кута розкриття та покращену інтеграцію з Jetpack Compose. Бібліотека зворотно сумісна аж до Android 10 (API 29) через Support Library і автоматично адаптується до можливостей пристрою.
FoldingFeature — центральний клас Jetpack WindowManager для роботи зі складаними пристроями. Він інкапсулює всю інформацію про фізичне положення складки: стан (HALF_OPENED, FLAT, TABLE_TOP), орієнтацію (VERTICAL, HORIZONTAL), координати шарніра та кут розкриття в градусах.
Бібліотека визначає чотири стани складки. STATE_FLAT — пристрій повністю розкладено, екран плоский. STATE_HALF_OPENED — пристрій частково складено, екран під кутом від 30 до 160 градусів. STATE_TABLE_TOP — пристрій стоїть на поверхні в позіції ноутбука. STATE_FULLY_OPENED — застарілий стан, замінений на FLAT у версії 1.2.
Складка може бути вертикальною (VERTICAL_FOLD) або горизонтальною (HORIZONTAL_FOLD). Bounds — прямокутник, що описує область складки в координатах вікна програми. Розробник використовує ці дані для розміщення елементів UI вище та нижче складки, уникаючи перекриття вмісту критичною областю.
val windowManager = WindowManager(context)
val flow = windowManager.foldingFeature()
flow.collect { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.FLAT -> showFullScreen(feature.bounds)
FoldingFeature.State.HALF_OPENED -> splitContentAcrossFold(feature.bounds)
FoldingFeature.State.TABLE_TOP -> enableTouchpadMode()
}
}
WindowMetrics — API для отримання точних розмірів вікна програми, доступне з WindowManager 1.0. На відміну від Display#getSize, WindowMetrics враховує багатовіконний режим, DeX та вікно вільної форми. Метрики повертають currentWindowMetrics (поточний розмір) та maximumWindowMetrics (максимально можливий розмір на пристрої).
WindowSizeClass — класифікатор, що з'явився в WindowManager 1.1. Він ділить екрани на три категорії: Compact (ширина менше 600dp — телефон), Medium (600–840dp — планшет в портретній орієнтації) та Expanded (понад 840dp — планшет в ландшафті). Цей клас спрощує адаптивне макетування, замінюючи десятки перевірок розмірів однією класифікацією.
| WindowSizeClass | Ширина екрана | Приклад пристрою | Рекомендований макет |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Одна панель, нижня навігація |
| Medium | 600–839dp | Pixel Fold (складено), iPad Mini | Список-деталі, бічна навігація |
| Expanded | 840dp+ | Galaxy Z Fold (розкладено), iPad Pro | Багато панелей, навігаційна рейка |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController — компонент WindowManager, відповідальний за збереження стану Activity при зміні конфігурації складаного пристрою. Коли користувач розкладає або складає телефон, контролер сповіщає програмі про нову позу та надає механізми для плавного переходу.
Контролер реєструє слухачів через registerContinuityListener, який приймає зворотний виклик з об'єктом FoldingFeature. При кожній зміні пози зворотний виклик спрацьовує до перестворення Activity, надаючи розробнику можливість зберегти стан вручну. Якщо програма використовує ViewModel, додаткова обробка не потрібна — дані зберігаються автоматично.
Compose-програми отримують переваги ScreenContinuity через LocalWindowSizeClass та CompositionLocalProvider. Компоненти автоматично рекомпозуються при зміні WindowMetrics. rememberSaveable зберігає стан між рекомпозиціями, а Modifier.windowInsets враховує системні області екрана.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Розглянемо повний приклад Activity, яка використовує Jetpack WindowManager для адаптації інтерфейсу під різні пози складаного пристрою. WindowManagerActivity підписується на зміни FoldingFeature через Flow API та перемикає макет між одно- та двопанельним режимами.
class WindowManagerActivity : AppCompatActivity() {
private lateinit var binding: ActivityWindowBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityWindowBinding.inflate(layoutInflater)
setContentView(binding.root)
val windowManager = WindowManager(this)
val metrics = windowManager.currentWindowMetrics
if (metrics.bounds.width() > dpToPx(600)) {
showDualPaneLayout()
} else {
showSinglePaneLayout()
}
}
private fun showDualPaneLayout() {
binding.content.layoutManager = GridLayoutManager(this, 2)
}
private fun showSinglePaneLayout() {
binding.content.layoutManager = LinearLayoutManager(this)
}
}
Приклад демонструє базовий сценарій: програма перевіряє WindowMetrics та вибирає одно- або двопанельний макет. У реальних проєктах рекомендується використовувати WindowSizeClass для більш гнучкої адаптації та FoldingFeature для обробки складаних пристроїв. Бібліотека також підтримує seamless transition — плавну анімацію при перемиканні між макетами.
Android Studio містить вбудовані інструменти для тестування Jetpack WindowManager. Емулятор підтримує складані пристрої (Pixel Fold, Galaxy Z Fold) з перемиканням поз через вкладку Folding Postures. Layout Inspector показує поточні WindowMetrics та межі FoldingFeature в реальному часі.
Команда adb shell dumpsys window displays виводить інформацію про всі підключені дисплеї та їх конфігурації. Для симуляції складки використовуйте adb shell am broadcast -a android.intent.action.SCREEN_ON з додатковими параметрами пози. WindowManager логує всі зміни FoldingFeature через WindowManager#logState.
Основні проблеми інтеграції — ігнорування оновлень WindowMetrics в багатовіконному режимі, неправильна обробка bounds при вертикальній складці та відсутність тестування на всіх позах. Рекомендується тестувати кожну позу окремо та перевіряти поведінку при перемиканні між ними. Використання WindowSizeClass замість ручних перевірок розмірів знижує кількість помилок на 60%.
Часто запитують
Jetpack WindowManager доступний починаючи з Android 5.0 (API 21) через Jetpack AndroidX. Однак для роботи FoldingFeature та ScreenContinuityController потрібен пристрій з Android 10+ (API 29) та фізичною складкою. WindowMetrics працює на всіх версіях, але точність даних залежить від виробника.
Display API застарів і не враховує складані пристрої, багатовіконний та DeX-режими. WindowManager надає єдиний API для всіх сценаріїв: FoldingFeature для складок, WindowMetrics для точних розмірів та WindowSizeClass для адаптивного макетування. Display#getSize може повертати некоректні дані в багатовіконному режимі.
WindowSizeClass замінює десятки перевірок ширини екрана трьома категоріями: Compact, Medium та Expanded. Замість ручного розрахунку dp та порівняння з порогами, розробник обирає макет для конкретної категорії. Це спрощує код, знижує ймовірність помилок та прискорює підтримку нових пристроїв.
Так, WindowManager корисний навіть для звичайних телефонів. WindowMetrics коректно працює в багатовіконному режимі та при використанні DeX. WindowSizeClass допомагає адаптувати інтерфейс для планшетів та великих екранів. Бібліотека додає лише 48 КБ до APK і не впливає на продуктивність.
Android Emulator з AVD типу Pixel Fold або Galaxy Z Fold повністю симулює роботу FoldingFeature. У Extended Controls виберіть вкладку Folding Postures та перемикайте пози. Також можна використовувати WindowManager Test Kit для модульного тестування з mock-об'єктами FoldingFeature.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.