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, стабилна верзија 1.3 Jetpack WindowManager-а укључује подршку за сензоре шарке, 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 при промени конфигурације склопивог уређаја. Када корисник расклопи или склопи телефон, контролер обавештава апликацију о новом положају и пружа механизме за глатку транзицију.

Контролер региструје слушаоце кроз 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 и поређења са граничним вредностима, програмер бира распоред за одређену категорију. Ово поједностављује код, смањује вероватноћу грешака и убрзава подршку за нове уређаје.

Да ли треба додати WindowManager у пројекат ако нема склопивих уређаја?

Да, WindowManager је користан чак и за обичне телефоне. WindowMetrics исправно ради у multi-window режиму и при коришћењу DeX-а. WindowSizeClass помаже у прилагођавању интерфејса за таблете и велике екране. Библиотека додаје само 48 KB 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. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође