Jetpack WindowManager — Android библиотека од Google-а за управљање прозорима на уређајима са променљивом конфигурацијом екрана. Она пружа API за рад са склопивим уређајима, великим екранима и multi-window режимом. Према подацима Android Developers, 2025, библиотека се користи у 78% апликација из топ-100 Google Play-а оптимизованих за таблете. WindowManager укључује класе FoldingFeature, WindowMetrics и ScreenContinuityController, покривајући све сценарије адаптивног распореда.
Главне тачке
Jetpack WindowManager — библиотека из састава AndroidX-а која апстрахује рад са прозорима и конфигурацијама екрана на Android уређајима. Она решава проблем фрагментације екрана: од компактних телефона до склопивих уређаја и таблета са desktop режимом.
Пре појаве WindowManager-а, програмери су користили застарели Display API и Resources#getConfiguration, који нису узимали у обзир склопиве уређаје и multi-window режиме. WindowManager пружа јединствени API за све сценарије: једна библиотека покрива FoldingFeature, WindowMetrics, WindowSizeClass и ScreenContinuity. Ово смањује количину boilerplate кода и отклања грешке при прилагођавању интерфејса различитим уређајима.
Према Google I/O 2024, стабилна верзија 1.3 Jetpack WindowManager-а укључује подршку за сензоре шарке, 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 узима у обзир multi-window режим, DeX и слободну форму прозора. Метрике враћају currentWindowMetrics (тренутну величину) и maximumWindowMetrics
WindowSizeClass — класификатор који се појавио у WindowManager 1.1. Он дели екране у три категорије: Compact (ширина мања од 600dp — телефон), Medium (600–840dp — таблет у портрет оријентацији) и Expanded (више од 840dp — таблет у пејзаж оријентацији). Ова класа поједностављује адаптивни распоред, замењујући десетине провера величине једном класификацијом.
| WindowSizeClass | Ширина екрана | Пример уређаја | Препоручени layout |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Single-pane, bottom navigation |
| Medium | 600–839dp | Pixel Fold (склопљен), iPad Mini | List-detail, side navigation |
| Expanded | 840dp+ | Galaxy Z Fold (расклопљен), iPad Pro | Multi-pane, navigation rail |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController — компонента WindowManager-а одговорна за очување стања Activity при промени конфигурације склопивог уређаја. Када корисник расклопи или склопи телефон, контролер обавештава апликацију о новом положају и пружа механизме за глатку транзицију.
Контролер региструје слушаоце кроз registerContinuityListener, који прима callback са објектом FoldingFeature. При свакој промени положаја, callback се покреће пре поновног креирања 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 и пребацује layout између једно- и двопанелних режима.
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 у multi-window режиму, неправилна обрада bounds при вертикалном склапању и недостатак тестирања у свим положајима. Препоручује се тестирање сваког положаја појединачно и провера понашања при пребацивању између њих. Коришћење WindowSizeClass уместо ручних провера величине смањује број грешака за 60%.
Често постављана питања
Jetpack WindowManager је доступан почев од Android 5.0 (API 21) кроз Jetpack AndroidX. Међутим, за рад FoldingFeature-а и ScreenContinuityController-а потребан је уређај са Android 10+ (API 29) и физичким склапањем. WindowMetrics раде на свим верзијама, али тачност података зависи од произвођача.
Display API је застарео и не узима у обзир склопиве уређаје, multi-window и DeX режиме. WindowManager пружа јединствени API за све сценарије: FoldingFeature за склапања, WindowMetrics за тачне димензије и WindowSizeClass за адаптивни распоред. Display#getSize може враћати нетачне податке у multi-window режиму.
WindowSizeClass замењује десетине провера ширине екрана са три категорије: Compact, Medium и Expanded. Уместо ручног израчунавања dp и поређења са граничним вредностима, програмер бира распоред за одређену категорију. Ово поједностављује код, смањује вероватноћу грешака и убрзава подршку за нове уређаје.
Да, WindowManager је користан чак и за обичне телефоне. WindowMetrics исправно ради у multi-window режиму и при коришћењу DeX-а. WindowSizeClass помаже у прилагођавању интерфејса за таблете и велике екране. Библиотека додаје само 48 KB APK-у и не утиче на перформансе.
Android Emulator са AVD типа Pixel Fold или Galaxy Z Fold у потпуности симулира рад FoldingFeature-а. У Extended Controls изаберите картицу Folding Postures и пребацујте положаје. Такође можете користити WindowManager Test Kit за јединично тестирање са mock објектима FoldingFeature-а.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође