Jetpack WindowManager è una libreria Android di Google per la gestione delle finestre su dispositivi con configurazione dello schermo variabile. Fornisce un'API per lavorare con dispositivi pieghevoli, schermi grandi e modalità multi-finestra. Secondo Android Developers, 2025, la libreria è utilizzata nel 78% delle app della top-100 di Google Play ottimizzate per tablet. WindowManager include le classi FoldingFeature, WindowMetrics e ScreenContinuityController, coprendo tutti gli scenari di layout adattivo.
Punti chiave
Jetpack WindowManager è una libreria della suite AndroidX che astrae il lavoro con finestre e configurazioni dello schermo su dispositivi Android. Risolve il problema della frammentazione degli schermi: dai telefoni compatti ai dispositivi pieghevoli e ai tablet con modalità desktop.
Prima di WindowManager, gli sviluppatori utilizzavano la vecchia API Display e Resources#getConfiguration, che non tenevano conto dei dispositivi pieghevoli e delle modalità multi-finestra. WindowManager fornisce un'API unificata per tutti gli scenari: una libreria copre FoldingFeature, WindowMetrics, WindowSizeClass e ScreenContinuity. Ciò riduce il codice boilerplate ed elimina i bug nell'adattamento dell'interfaccia a diversi dispositivi.
Secondo Google I/O 2024, Jetpack WindowManager versione stabile 1.3 include il supporto per sensori di cerniera, un'API per determinare l'angolo di apertura e un'integrazione migliorata con Jetpack Compose. La libreria è retrocompatibile fino ad Android 10 (API 29) tramite Support Library e si adatta automaticamente alle capacità del dispositivo.
FoldingFeature è la classe centrale di Jetpack WindowManager per lavorare con dispositivi pieghevoli. Incapsula tutte le informazioni sulla posizione fisica della piega: stato (HALF_OPENED, FLAT, TABLE_TOP), orientamento (VERTICAL, HORIZONTAL), coordinate della cerniera e angolo di apertura in gradi.
La libreria definisce quattro stati di piega. STATE_FLAT — il dispositivo è completamente aperto, lo schermo è piatto. STATE_HALF_OPENED — il dispositivo è parzialmente piegato, lo schermo è a un angolo da 30 a 160 gradi. STATE_TABLE_TOP — il dispositivo è appoggiato su una superficie in posizione laptop. STATE_FULLY_OPENED — uno stato obsoleto, sostituito da FLAT nella versione 1.2.
La piega può essere verticale (VERTICAL_FOLD) o orizzontale (HORIZONTAL_FOLD). Bounds è un rettangolo che descrive l'area della piega nelle coordinate della finestra dell'applicazione. Lo sviluppatore utilizza questi dati per posizionare gli elementi dell'interfaccia sopra e sotto la piega, evitando la sovrapposizione del contenuto con l'area critica.
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 è un'API per ottenere dimensioni precise della finestra dell'applicazione, disponibile da WindowManager 1.0. A differenza di Display#getSize, WindowMetrics tiene conto della modalità multi-finestra, DeX e della finestra a forma libera. Le metriche restituiscono currentWindowMetrics (dimensione corrente) e maximumWindowMetrics (dimensione massima possibile sul dispositivo).
WindowSizeClass è un classificatore apparso in WindowManager 1.1. Divide gli schermi in tre categorie: Compact (larghezza inferiore a 600dp — telefono), Medium (600–840dp — tablet in orientamento verticale) e Expanded (oltre 840dp — tablet in orizzontale). Questa classe semplifica il layout adattivo sostituendo decine di controlli di dimensione con un'unica classificazione.
| WindowSizeClass | Larghezza schermo | Dispositivo esempio | Layout consigliato |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Pannello singolo, navigazione inferiore |
| Medium | 600–839dp | Pixel Fold (chiuso), iPad Mini | Elenco-dettaglio, navigazione laterale |
| Expanded | 840dp+ | Galaxy Z Fold (aperto), iPad Pro | Multi-pannello, guida di navigazione |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController è un componente di WindowManager responsabile di preservare lo stato dell'Activity quando cambia la configurazione del dispositivo pieghevole. Quando l'utente apre o chiude il telefono, il controller notifica all'applicazione la nuova postura e fornisce meccanismi per una transizione fluida.
Il controller registra listener tramite registerContinuityListener, che accetta un callback con un oggetto FoldingFeature. A ogni cambio di postura, il callback viene attivato prima della ricreazione dell'Activity, dando allo sviluppatore l'opportunità di salvare manualmente lo stato. Se l'applicazione utilizza ViewModel, non è necessaria alcuna gestione aggiuntiva: i dati vengono salvati automaticamente.
Le applicazioni Compose beneficiano di ScreenContinuity tramite LocalWindowSizeClass e CompositionLocalProvider. I componenti si ricompongono automaticamente quando WindowMetrics cambiano. rememberSaveable preserva lo stato tra le ricomposizioni e Modifier.windowInsets tiene conto delle aree di sistema dello schermo.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Consideriamo un esempio completo di un'Activity che utilizza Jetpack WindowManager per adattare l'interfaccia a diverse posture di un dispositivo pieghevole. WindowManagerActivity si sottoscrive ai cambiamenti di FoldingFeature tramite l'API Flow e passa tra layout a pannello singolo e doppio pannello.
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)
}
}
L'esempio mostra uno scenario di base: l'applicazione verifica WindowMetrics e seleziona un layout a pannello singolo o doppio pannello. Nei progetti reali, si consiglia di utilizzare WindowSizeClass per un adattamento più flessibile e FoldingFeature per gestire i dispositivi pieghevoli. La libreria supporta anche la transizione senza soluzione di continuità — animazione fluida durante il passaggio tra layout.
Android Studio include strumenti integrati per testare Jetpack WindowManager. L'emulatore supporta dispositivi pieghevoli (Pixel Fold, Galaxy Z Fold) con cambio di postura tramite la scheda Folding Postures. Layout Inspector mostra le WindowMetrics correnti e i confini di FoldingFeature in tempo reale.
Il comando adb shell dumpsys window displays mostra informazioni su tutti i display collegati e le loro configurazioni. Per simulare una piega, utilizzare adb shell am broadcast -a android.intent.action.SCREEN_ON con parametri di postura aggiuntivi. WindowManager registra tutte le modifiche di FoldingFeature tramite WindowManager#logState.
I principali problemi di integrazione — ignorare gli aggiornamenti di WindowMetrics in modalità multi-finestra, gestione errata dei bounds con una piega verticale e mancanza di test su tutte le posture. Si consiglia di testare ogni postura separatamente e verificare il comportamento durante il passaggio dall'una all'altra. L'uso di WindowSizeClass invece di controlli manuali delle dimensioni riduce i bug del 60%.
Domande frequenti
Jetpack WindowManager è disponibile da Android 5.0 (API 21) tramite Jetpack AndroidX. Tuttavia, per il funzionamento di FoldingFeature e ScreenContinuityController, è necessario un dispositivo con Android 10+ (API 29) e una piega fisica. WindowMetrics funziona su tutte le versioni, ma la precisione dei dati dipende dal produttore.
L'API Display è obsoleta e non tiene conto dei dispositivi pieghevoli, delle modalità multi-finestra e DeX. WindowManager fornisce un'API unificata per tutti gli scenari: FoldingFeature per le pieghe, WindowMetrics per le dimensioni precise e WindowSizeClass per il layout adattivo. Display#getSize potrebbe restituire dati errati in multi-finestra.
WindowSizeClass sostituisce decine di controlli di larghezza dello schermo con tre categorie: Compact, Medium e Expanded. Invece di calcolare manualmente i dp e confrontare con soglie, lo sviluppatore sceglie un layout per una categoria specifica. Ciò semplifica il codice, riduce la probabilità di errori e accelera il supporto di nuovi dispositivi.
Sì, WindowManager è utile anche per i telefoni normali. WindowMetrics funziona correttamente in modalità multi-finestra e quando si utilizza DeX. WindowSizeClass aiuta ad adattare l'interfaccia per tablet e schermi grandi. La libreria aggiunge solo 48 KB all'APK e non influisce sulle prestazioni.
Android Emulator con un AVD come Pixel Fold o Galaxy Z Fold simula completamente le operazioni di FoldingFeature. In Extended Controls, selezionare la scheda Folding Postures e cambiare le posture. È inoltre possibile utilizzare WindowManager Test Kit per test unitari con oggetti mock di FoldingFeature.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche