Jetpack WindowManager — een Android-bibliotheek van Google voor het beheren van vensters op apparaten met variabele schermconfiguratie. Het biedt een API voor het werken met opvouwbare apparaten, grote schermen en multi-window modus. Volgens gegevens van Android Developers, 2025 wordt de bibliotheek gebruikt in 78% van de apps uit de top-100 van Google Play die zijn geoptimaliseerd voor tablets. WindowManager bevat de klassen FoldingFeature, WindowMetrics en ScreenContinuityController en dekt alle scenario's voor adaptieve lay-out.
Belangrijkste punten
Jetpack WindowManager — een bibliotheek uit het AndroidX-pakket die het werken met vensters en schermconfiguraties op Android-apparaten abstraheert. Het lost het probleem van schermfragmentatie op: van compacte telefoons tot opvouwbare apparaten en tablets met desktopmodus.
Vóór de komst van WindowManager gebruikten ontwikkelaars de verouderde Display API en Resources#getConfiguration, die geen rekening hielden met opvouwbare apparaten en multi-window modi. WindowManager biedt een uniforme API voor alle scenario's: één bibliotheek dekt FoldingFeature, WindowMetrics, WindowSizeClass en ScreenContinuity. Dit vermindert de hoeveelheid boilerplate-code en elimineert bugs bij het aanpassen van de interface aan verschillende apparaten.
Volgens Google I/O 2024 bevat de stabiele versie 1.3 van Jetpack WindowManager ondersteuning voor scharniersensoren, een API voor het bepalen van de openingshoek en verbeterde integratie met Jetpack Compose. De bibliotheek is achterwaarts compatibel tot Android 10 (API 29) via Support Library en past zich automatisch aan de mogelijkheden van het apparaat aan.
FoldingFeature — de centrale klasse van Jetpack WindowManager voor het werken met opvouwbare apparaten. Het kapselt alle informatie over de fysieke positie van de vouw in: status (HALF_OPENED, FLAT, TABLE_TOP), oriëntatie (VERTICAL, HORIZONTAL), scharniercoördinaten en openingshoek in graden.
De bibliotheek definieert vier vouwstatussen. STATE_FLAT — het apparaat is volledig uitgevouwen, het scherm is plat. STATE_HALF_OPENED — het apparaat is gedeeltelijk gevouwen, het scherm staat onder een hoek van 30 tot 160 graden. STATE_TABLE_TOP — het apparaat staat op een oppervlak in laptopstand. STATE_FULLY_OPENED — een verouderde status, vervangen door FLAT in versie 1.2.
De vouw kan verticaal (VERTICAL_FOLD) of horizontaal (HORIZONTAL_FOLD) zijn. Bounds — een rechthoek die het vouwgebied beschrijft in de coördinaten van het toepassingsvenster. De ontwikkelaar gebruikt deze gegevens om UI-elementen boven en onder de vouw te plaatsen, zodat inhoud niet over het kritieke gebied valt.
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 — een API voor het ophalen van de exacte afmetingen van het toepassingsvenster, beschikbaar sinds WindowManager 1.0. In tegenstelling tot Display#getSize houdt WindowMetrics rekening met de multi-window modus, DeX en de vrije venstervorm. De metrieken retourneren currentWindowMetrics (huidige grootte) en maximumWindowMetrics (maximaal mogelijke grootte op het apparaat).
WindowSizeClass — een classificator die verscheen in WindowManager 1.1. Het verdeelt schermen in drie categorieën: Compact (breedte minder dan 600dp — telefoon), Medium (600–840dp — tablet in portretoriëntatie) en Expanded (meer dan 840dp — tablet in landschapsoriëntatie). Deze klasse vereenvoudigt adaptieve lay-out door tientallen maatcontroles te vervangen door één classificatie.
| WindowSizeClass | Schermbreedte | Voorbeeldapparaat | Aanbevolen lay-out |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Single-pane, bottom navigation |
| Medium | 600–839dp | Pixel Fold (ingeklapt), iPad Mini | List-detail, side navigation |
| Expanded | 840dp+ | Galaxy Z Fold (uitgeklapt), 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 — een WindowManager-component die verantwoordelijk is voor het behouden van de Activity-status bij wijziging van de configuratie van een opvouwbaar apparaat. Wanneer de gebruiker de telefoon uit- of inklapt, stelt de controller de app op de hoogte van de nieuwe houding en biedt mechanismen voor een soepele overgang.
De controller registreert luisteraars via registerContinuityListener, die een callback ontvangt met een FoldingFeature-object. Bij elke houdingswijziging wordt de callback geactiveerd vóór het opnieuw aanmaken van de Activity, waardoor de ontwikkelaar de status handmatig kan opslaan. Als de app ViewModel gebruikt, is er geen extra verwerking nodig — gegevens worden automatisch opgeslagen.
Compose-apps profiteren van ScreenContinuity via LocalWindowSizeClass en CompositionLocalProvider. Componenten worden automatisch opnieuw samengesteld bij wijziging van WindowMetrics. rememberSaveable behoudt de status tussen recomposities, en Modifier.windowInsets houdt rekening met systeemgebieden van het scherm.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Laten we een volledig voorbeeld bekijken van een Activity die Jetpack WindowManager gebruikt om de interface aan te passen aan verschillende houdingen van een opvouwbaar apparaat. WindowManagerActivity abonneert zich op wijzigingen in FoldingFeature via de Flow API en schakelt de lay-out tussen enkele en dubbele paneelmodi.
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)
}
}
Het voorbeeld toont een basisscenario: de app controleert WindowMetrics en kiest een lay-out met één of twee panelen. In echte projecten wordt aanbevolen om WindowSizeClass te gebruiken voor flexibelere aanpassing en FoldingFeature voor de verwerking van opvouwbare apparaten. De bibliotheek ondersteunt ook seamless transition — vloeiende animatie bij het schakelen tussen lay-outs.
Android Studio bevat ingebouwde hulpmiddelen voor het testen van Jetpack WindowManager. De emulator ondersteunt opvouwbare apparaten (Pixel Fold, Galaxy Z Fold) met het schakelen van houdingen via het tabblad Folding Postures. Layout Inspector toont de huidige WindowMetrics en FoldingFeature-grenzen in realtime.
De opdracht adb shell dumpsys window displays geeft informatie over alle aangesloten beeldschermen en hun configuraties. Gebruik adb shell am broadcast -a android.intent.action.SCREEN_ON met extra houdingsparameters om het vouwen te simuleren. WindowManager logt alle wijzigingen in FoldingFeature via WindowManager#logState.
De belangrijkste problemen bij integratie — het negeren van WindowMetrics-updates in de multi-window modus, onjuiste verwerking van bounds bij verticaal vouwen en het ontbreken van tests in alle houdingen. Aanbevolen wordt elke houding afzonderlijk te testen en het gedrag bij het schakelen ertussen te controleren. Het gebruik van WindowSizeClass in plaats van handmatige maatcontroles vermindert het aantal bugs met 60%.
Veelgestelde vragen
Jetpack WindowManager is beschikbaar vanaf Android 5.0 (API 21) via Jetpack AndroidX. Voor de werking van FoldingFeature en ScreenContinuityController is echter een apparaat met Android 10+ (API 29) en fysieke vouw vereist. WindowMetrics werken op alle versies, maar de nauwkeurigheid van de gegevens hangt af van de fabrikant.
Display API is verouderd en houdt geen rekening met opvouwbare apparaten, multi-window en DeX-modus. WindowManager biedt een uniforme API voor alle scenario's: FoldingFeature voor vouwen, WindowMetrics voor exacte afmetingen en WindowSizeClass voor adaptieve lay-out. Display#getSize kan onjuiste gegevens retourneren in multi-window.
WindowSizeClass vervangt tientallen controles van de schermbreedte door drie categorieën: Compact, Medium en Expanded. In plaats van handmatige dp-berekening en vergelijking met drempelwaarden, kiest de ontwikkelaar een lay-out voor een specifieke categorie. Dit vereenvoudigt de code, vermindert de kans op fouten en versnelt de ondersteuning van nieuwe apparaten.
Ja, WindowManager is zelfs voor gewone telefoons nuttig. WindowMetrics werkt correct in de multi-window modus en bij gebruik van DeX. WindowSizeClass helpt de interface aan te passen voor tablets en grote schermen. De bibliotheek voegt slechts 48 KB toe aan de APK en heeft geen invloed op de prestaties.
Android Emulator met een AVD van het type Pixel Fold of Galaxy Z Fold simuleert de werking van FoldingFeature volledig. Selecteer in Extended Controls het tabblad Folding Postures en schakel tussen houdingen. U kunt ook WindowManager Test Kit gebruiken voor unittesten met mock-objecten van FoldingFeature.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook