Window Size Class — это API из Jetpack WindowManager, который делит окно приложения на три категории: Compact, Medium и Expanded. Вместо проверки физического разрешения или плотности пикселей, классы анализируют доступную ширину в dp — это даёт предсказуемый результат на любых устройствах. По данным Android Developers Documentation (2025), Window Size Class стал стандартом для адаптивных интерфейсов в Jetpack Compose и View-системе благодаря WindowManager.
Главное
Window Size Class — это API платформы Android, входящий в библиотеку Jetpack WindowManager, который классифицирует доступное пространство окна приложения по трём категориям. В отличие от традиционного подхода с квантификаторами ресурсов (small/large/xlarge), Window Size Class даёт дискретный набор значений, на которые разработчик может опираться при проектировании интерфейса.
API появился в Android 7.0 Nougat как часть поддержки многооконного режима, но активное внедрение началось с Jetpack WindowManager 1.1 (2022). Google рекомендует Window Size Class как основной инструмент для построения адаптивных макетов вместо проверки ширины экрана через Display.getSize().
Классификация основана на ширине окна в dp, а не на физическом размере или плотности пикселей. Это значит, что два устройства с разным разрешением, но одинаковой шириной в dp получат одинаковый класс — интерфейс будет предсказуемо одинаковым.
Compact — класс для окон шириной до 600 dp. Телефон в портретном режиме, большинство раскладушек (Galaxy Z Flip) в сложенном состоянии. Интерфейс строится в один столбец, навигация через Bottom Navigation.
Medium — класс для окон шириной 600–840 dp. Планшет в портрете, телефон в альбоме, складное устройство в полураскрытом состоянии. Интерфейс использует два столбца — например, список слева и детали справа. Navigation Rail заменяет Bottom Navigation.
Expanded — класс для окон шириной от 840 dp. Планшет в альбоме, десктопное окно, складное устройство в разложенном виде. Интерфейс может использовать три и более панелей, Permanent Navigation Drawer, панели инструментов.
В Material Design 3 для каждого класса определены адаптивные компоненты: Navigation Rail для Medium, Navigation Drawer для Expanded, Bottom Navigation для Compact. Разработчику не нужно подбирать breakpoints — они уже заданы API.
Window Size Class вычисляется на основе текущей ширины окна приложения в dp с учётом системных элементов — строки состояния, панели навигации, деления экрана в Split Screen. API срабатывает при изменении конфигурации окна: повороте устройства, входе в многооконный режим, раскладывании складного устройства.
Для получения класса используется класс WindowSizeClass из библиотеки androidx.window. Разработчик подписывается на Flow (Kotlin) или LiveData (Java), который автоматически обновляет класс при каждом изменении размеров окна — без ручной обработки onConfigurationChanged.
Классификация происходит в три шага. Первый — измерение текущей ширины окна в пикселях. Второй — конвертация в dp через DisplayMetrics.density. Третий — сравнение полученного значения с порогами: меньше 600 dp — Compact, 600–840 — Medium, от 840 — Expanded.
val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass()
when (windowSizeClass.windowWidthSizeClass) {
WindowWidthSizeClass.COMPACT -> // compact width
WindowWidthSizeClass.MEDIUM -> // medium width
WindowWidthSizeClass.EXPANDED -> // expanded width
}
Помимо ширины (windowWidthSizeClass), API предоставляет класс для высоты окна (windowHeightSizeClass) — полезно для альбомной ориентации и десктопных окон.
В Jetpack Compose Window Size Class используется через функцию currentWindowAdaptiveInfo(), которая возвращает WindowAdaptiveInfo с классами ширины и высоты. Эта функция учитывает не только размер окна, но и тип ввода (клавиатура, мышь, сенсор) — через WindowPosture и WindowLayoutInfo.
Типовой сценарий — переключение между лейаутами в зависимости от класса. Например, на Compact отображается BottomSheet с выбором, на Medium — боковая панель, на Expanded — постоянный Navigation Drawer.
@Composable
fun AdaptiveNavigation(windowSizeClass: WindowWidthSizeClass) {
when (windowSizeClass) {
WindowWidthSizeClass.COMPACT -> BottomNavigation()
WindowWidthSizeClass.MEDIUM -> NavigationRail()
WindowWidthSizeClass.EXPANDED -> NavigationDrawer()
}
}
В Material Design 3 компоненты NavigationSuiteScaffold автоматически подстраиваются под Window Size Class — разработчику не нужно писать условную логику.
Material Design 3 (Material You) полностью интегрирован с Window Size Class. Система adaptive layout в Material 3 определяет, какой компонент навигации использовать на каждом классе: BottomNavigation для Compact, NavigationRail для Medium, NavigationDrawer для Expanded.
Эта интеграция работает на уровне Adaptive API, который объединяет Window Size Class с другими сигналами — FoldState (складное устройство) и WindowPosture (положение экрана). Adaptive API доступен через библиотеку material3-adaptive.
Material 3 предоставляет четыре адаптивных компонента верхнего уровня: ListDetailPaneScaffold, SupportingPaneScaffold, NavigationSuiteScaffold и AdaptiveSheet. Каждый из них меняет своё поведение в зависимости от Window Size Class без дополнительной настройки.
| Класс | Navigation Component | Pane Scaffold |
|---|---|---|
| Compact | Bottom Navigation | Скрытая панель |
| Medium | Navigation Rail | Выдвижная панель |
| Expanded | Navigation Drawer | Постоянная панель |
Использование Window Size Class даёт три ключевых преимущества в мобильной разработке. Первое — предсказуемость: вместо сотен комбинаций размеров экрана разработчик работает с тремя классами. Это радикально сокращает количество тестовых сценариев и багов, связанных с разметкой.
Второе — автоматическая адаптация к многооконному режиму. Когда пользователь входит в Split Screen, ширина окна меняется — Window Size Class мгновенно пересчитывается, и интерфейс подстраивается. Без этого API приложение в разделённом экране показывает урезанную версию интерфейса для телефона.
Третье — консистентность с Material Design 3. Google встроил Window Size Class в систему адаптивных компонентов, поэтому интерфейсы, построенные на Material 3, автоматически следуют рекомендациям Google по large screen-дизайну без дополнительной работы.
Часто задаваемые вопросы
Screen Size Buckets (small/large/xlarge) — устаревший подход Android 1.6–6.0, основанный на физическом размере экрана. Window Size Class ориентируется на доступную ширину окна в dp и работает в реальном времени при изменении размера окна.
Window Size Class доступен через Jetpack WindowManager на Android 7.0+ с backport-библиотекой. Для Android 6 и ниже — только Compact, так как multi-window отсутствует. Используйте fallback через WindowMetrics.
При раскладывании устройства ширина окна меняется, и Window Size Class пересчитывается автоматически. Класс может измениться с Compact на Expanded за счёт увеличения доступной области.
Да, через WindowManager в Activity или Fragment. После получения WindowSizeClass используйте условную логику для переключения между XML-лейаутами или изменения видимости View.
Для высоты окна пороги отличаются: Compact — до 480 dp, Medium — 480–900 dp, Expanded — от 900 dp. WindowHeightSizeClass полезен в альбомной ориентации и на десктопе.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также