Jetpack WindowManager: что это, библиотека для складных устройств

Автор: IT Sectr Опубликовано: 2026-06-09 Время чтения: 5 мин

Jetpack WindowManager — библиотека Android от Google для управления окнами на устройствах с изменяемой конфигурацией экрана. Она предоставляет API для работы со складными устройствами, большими экранами и multi-window режимом. По данным 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-устройствах. Она решает проблему фрагментации экранов: от компактных телефонов до складных устройств и планшетов с desktop-режимом.

До появления WindowManager разработчики использовали устаревший Display API и Resources#getConfiguration, которые не учитывали складные устройства и multi-window режимы. WindowManager предоставляет единый API для всех сценариев: одна библиотека покрывает FoldingFeature, WindowMetrics, WindowSizeClass и ScreenContinuity. Это снижает количество boilerplate-кода и устраняет баги при адаптации интерфейса под разные устройства.

По данным Google I/O 2024, Jetpack WindowManager стабильная версия 1.3 включает поддержку hinge-сенсоров, 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 учитывает multi-window режим, DeX и свободную форму окна. Метрики возвращают currentWindowMetrics (текущий размер) и maximumWindowMetrics (максимально возможный размер на устройстве).

WindowSizeClass — классификатор, появившийся в WindowManager 1.1. Он делит экраны на три категории: Compact (ширина менее 600dp — телефон), Medium (600–840dp — планшет в портретной ориентации) и Expanded (более 840dp — планшет в ландшафте). Этот класс упрощает адаптивную вёрстку, заменяя десятки проверок размеров одной классификацией.

WindowSizeClassШирина экранаПример устройстваРекомендуемый layout
Compact0–599dpPixel 8, Galaxy S24Single-pane, bottom navigation
Medium600–839dpPixel Fold (сложен), iPad MiniList-detail, side navigation
Expanded840dp+Galaxy Z Fold (разложен), iPad ProMulti-pane, navigation rail
kotlin
class MyComposable {
    @Composable
    fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
        when (windowSizeClass.widthSizeClass) {
            WindowWidthSizeClass.Compact -> CompactScreen()
            WindowWidthSizeClass.Expanded -> ExpandedScreen()
            else -> MediumScreen()
        }
    }
}

ScreenContinuityController и непрерывность экрана

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

Контроллер регистрирует слушателей через registerContinuityListener, который принимает callback с объектом FoldingFeature. При каждом изменении позы callback срабатывает до пересоздания 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 и переключает layout между одно- и двухпанельным режимами.

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 в multi-window режиме, неправильная обработка 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 устарел и не учитывает складные устройства, multi-window и DeX-режимы. WindowManager предоставляет единый API для всех сценариев: FoldingFeature для складок, WindowMetrics для точных размеров и WindowSizeClass для адаптивной вёрстки. Display#getSize может возвращать некорректные данные в multi-window.

Как WindowSizeClass помогает в адаптивной вёрстке?

WindowSizeClass заменяет десятки проверок ширины экрана тремя категориями: Compact, Medium и Expanded. Вместо ручного расчёта dp и сравнения с порогами разработчик выбирает layout под конкретную категорию. Это упрощает код, снижает вероятность ошибок и ускоряет поддержку новых устройств.

Нужно ли добавлять WindowManager в проект, если нет складных устройств?

Да, WindowManager полезен даже для обычных телефонов. WindowMetrics корректно работает в multi-window режиме и при использовании 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 возвращает точные размеры окна, учитывая multi-window и DeX-режимы.
  • WindowSizeClass классифицирует экраны на Compact, Medium и Expanded для упрощения адаптивной вёрстки.
  • ScreenContinuityController обеспечивает сохранение состояния Activity при сворачивании и разворачивании устройства.
  • Android Emulator поддерживает симуляцию всех поз складки для тестирования без физического устройства.
  • Рекомендуется добавлять WindowManager во все проекты для корректной работы на планшетах и складных устройствах.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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