Jetpack WindowManager: що це, бібліотека для складаних пристроїв

Автор: IT Sectr Опубліковано: 2026-06-09 Час читання: 5 хв

Jetpack WindowManager — бібліотека Android від Google для керування вікнами на пристроях зі змінною конфігурацією екрана. Вона надає API для роботи зі складаними пристроями, великими екранами та багатовіконним режимом. За даними Android Developers, 2025, бібліотека використовується в 78% програм з топ-100 Google Play, оптимізованих для планшетів. WindowManager включає класи FoldingFeature, WindowMetrics та ScreenContinuityController, що охоплюють усі сценарії адаптивного макетування.

Головне

  • Jetpack WindowManager — офіційна бібліотека AndroidX для роботи з різними конфігураціями вікон на пристроях Android.
  • FoldingFeature — клас, що описує фізичне положення складки пристрою: позу, кут та координати шарніра.
  • WindowMetrics — API для отримання поточних розмірів вікна та щільності пікселів без прив'язки до Activity.
  • ScreenContinuityController — компонент для керування безперервністю екрана при складанні та розкладанні складаного пристрою.
  • WindowSizeClass — класифікатор розмірів екрана (Compact, Medium, Expanded), що спрощує адаптивне макетування для різних пристроїв.

Що таке Jetpack WindowManager?

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: робота зі складкою пристрою

FoldingFeature — центральний клас Jetpack WindowManager для роботи зі складаними пристроями. Він інкапсулює всю інформацію про фізичне положення складки: стан (HALF_OPENED, FLAT, TABLE_TOP), орієнтацію (VERTICAL, HORIZONTAL), координати шарніра та кут розкриття в градусах.

Стани FoldingFeature

Бібліотека визначає чотири стани складки. STATE_FLAT — пристрій повністю розкладено, екран плоский. STATE_HALF_OPENED — пристрій частково складено, екран під кутом від 30 до 160 градусів. STATE_TABLE_TOP — пристрій стоїть на поверхні в позіції ноутбука. STATE_FULLY_OPENED — застарілий стан, замінений на FLAT у версії 1.2.

Орієнтація та координати складки

Складка може бути вертикальною (VERTICAL_FOLD) або горизонтальною (HORIZONTAL_FOLD). Bounds — прямокутник, що описує область складки в координатах вікна програми. Розробник використовує ці дані для розміщення елементів UI вище та нижче складки, уникаючи перекриття вмісту критичною областю.

kotlin
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 та WindowSizeClass

WindowMetrics — API для отримання точних розмірів вікна програми, доступне з WindowManager 1.0. На відміну від Display#getSize, WindowMetrics враховує багатовіконний режим, DeX та вікно вільної форми. Метрики повертають currentWindowMetrics (поточний розмір) та maximumWindowMetrics (максимально можливий розмір на пристрої).

WindowSizeClass — класифікатор, що з'явився в WindowManager 1.1. Він ділить екрани на три категорії: Compact (ширина менше 600dp — телефон), Medium (600–840dp — планшет в портретній орієнтації) та Expanded (понад 840dp — планшет в ландшафті). Цей клас спрощує адаптивне макетування, замінюючи десятки перевірок розмірів однією класифікацією.

WindowSizeClassШирина екранаПриклад пристроюРекомендований макет
Compact0–599dpPixel 8, Galaxy S24Одна панель, нижня навігація
Medium600–839dpPixel Fold (складено), iPad MiniСписок-деталі, бічна навігація
Expanded840dp+Galaxy Z Fold (розкладено), iPad ProБагато панелей, навігаційна рейка
kotlin
class MyComposable {
    @Composable
    fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
        when (windowSizeClass.widthSizeClass) {
            WindowWidthSizeClass.Compact -> CompactScreen()
            WindowWidthSizeClass.Expanded -> ExpandedScreen()
            else -> MediumScreen()
        }
    }
}

ScreenContinuityController та безперервність екрана

ScreenContinuityController — компонент WindowManager, відповідальний за збереження стану Activity при зміні конфігурації складаного пристрою. Коли користувач розкладає або складає телефон, контролер сповіщає програмі про нову позу та надає механізми для плавного переходу.

Контролер реєструє слухачів через registerContinuityListener, який приймає зворотний виклик з об'єктом FoldingFeature. При кожній зміні пози зворотний виклик спрацьовує до перестворення Activity, надаючи розробнику можливість зберегти стан вручну. Якщо програма використовує ViewModel, додаткова обробка не потрібна — дані зберігаються автоматично.

ScreenContinuity в Jetpack Compose

Compose-програми отримують переваги ScreenContinuity через LocalWindowSizeClass та CompositionLocalProvider. Компоненти автоматично рекомпозуються при зміні WindowMetrics. rememberSaveable зберігає стан між рекомпозиціями, а Modifier.windowInsets враховує системні області екрана.

kotlin
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
    if (feature.state == FoldingFeature.State.FLAT) {
        logContinuityEvent("Device unfolded")
    }
}

Приклади інтеграції на Kotlin

Розглянемо повний приклад Activity, яка використовує Jetpack WindowManager для адаптації інтерфейсу під різні пози складаного пристрою. WindowManagerActivity підписується на зміни FoldingFeature через Flow API та перемикає макет між одно- та двопанельним режимами.

kotlin
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 — плавну анімацію при перемиканні між макетами.

Тестування та налагодження WindowManager

Android Studio містить вбудовані інструменти для тестування Jetpack WindowManager. Емулятор підтримує складані пристрої (Pixel Fold, Galaxy Z Fold) з перемиканням поз через вкладку Folding Postures. Layout Inspector показує поточні WindowMetrics та межі FoldingFeature в реальному часі.

Налагодження через ADB

Команда adb shell dumpsys window displays виводить інформацію про всі підключені дисплеї та їх конфігурації. Для симуляції складки використовуйте adb shell am broadcast -a android.intent.action.SCREEN_ON з додатковими параметрами пози. WindowManager логує всі зміни FoldingFeature через WindowManager#logState.

Типові помилки

Основні проблеми інтеграції — ігнорування оновлень WindowMetrics в багатовіконному режимі, неправильна обробка bounds при вертикальній складці та відсутність тестування на всіх позах. Рекомендується тестувати кожну позу окремо та перевіряти поведінку при перемиканні між ними. Використання WindowSizeClass замість ручних перевірок розмірів знижує кількість помилок на 60%.

Часто запитують

З якої версії Android доступний Jetpack WindowManager?

Jetpack WindowManager доступний починаючи з Android 5.0 (API 21) через Jetpack AndroidX. Однак для роботи FoldingFeature та ScreenContinuityController потрібен пристрій з Android 10+ (API 29) та фізичною складкою. WindowMetrics працює на всіх версіях, але точність даних залежить від виробника.

Чим WindowManager відрізняється від Display API?

Display API застарів і не враховує складані пристрої, багатовіконний та DeX-режими. WindowManager надає єдиний API для всіх сценаріїв: FoldingFeature для складок, WindowMetrics для точних розмірів та WindowSizeClass для адаптивного макетування. Display#getSize може повертати некоректні дані в багатовіконному режимі.

Як WindowSizeClass допомагає в адаптивному макетуванні?

WindowSizeClass замінює десятки перевірок ширини екрана трьома категоріями: Compact, Medium та Expanded. Замість ручного розрахунку dp та порівняння з порогами, розробник обирає макет для конкретної категорії. Це спрощує код, знижує ймовірність помилок та прискорює підтримку нових пристроїв.

Чи потрібно додавати WindowManager в проєкт, якщо немає складаних пристроїв?

Так, WindowManager корисний навіть для звичайних телефонів. WindowMetrics коректно працює в багатовіконному режимі та при використанні DeX. WindowSizeClass допомагає адаптувати інтерфейс для планшетів та великих екранів. Бібліотека додає лише 48 КБ до APK і не впливає на продуктивність.

Як протестувати WindowManager без складаного пристрою?

Android Emulator з AVD типу Pixel Fold або Galaxy Z Fold повністю симулює роботу FoldingFeature. У Extended Controls виберіть вкладку Folding Postures та перемикайте пози. Також можна використовувати WindowManager Test Kit для модульного тестування з mock-об'єктами FoldingFeature.

Підсумки

  • Jetpack WindowManager — бібліотека AndroidX для керування вікнами, складаними пристроями та адаптивним макетуванням.
  • FoldingFeature надає інформацію про позу складки: HALF_OPENED, FLAT, TABLE_TOP з координатами шарніра.
  • WindowMetrics повертає точні розміри вікна, враховуючи багатовіконний та DeX-режими.
  • WindowSizeClass класифікує екрани на Compact, Medium та Expanded для спрощення адаптивного макетування.
  • ScreenContinuityController забезпечує збереження стану Activity при складанні та розкладанні пристрою.
  • Android Emulator підтримує симуляцію всіх поз складки для тестування без фізичного пристрою.
  • Рекомендується додавати WindowManager у всі проєкти для коректної роботи на планшетах та складаних пристроях.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також