Jetpack WindowManager est une bibliothèque Android de Google pour la gestion des fenêtres sur les appareils avec configuration d'écran variable. Elle fournit une API pour travailler avec les appareils pliables, les grands écrans et le mode multi-fenêtre. Selon Android Developers, 2025, la bibliothèque est utilisée dans 78% des applications du top-100 Google Play optimisées pour les tablettes. WindowManager inclut les classes FoldingFeature, WindowMetrics et ScreenContinuityController, couvrant tous les scénarios de mise en page adaptative.
Points clés
Jetpack WindowManager est une bibliothèque de la suite AndroidX qui abstrait le travail avec les fenêtres et les configurations d'écran sur les appareils Android. Elle résout le problème de la fragmentation des écrans : des téléphones compacts aux appareils pliables et aux tablettes en mode bureau.
Avant WindowManager, les développeurs utilisaient l'API Display obsolète et Resources#getConfiguration, qui ne prenaient pas en compte les appareils pliables et les modes multi-fenêtres. WindowManager fournit une API unifiée pour tous les scénarios : une bibliothèque couvre FoldingFeature, WindowMetrics, WindowSizeClass et ScreenContinuity. Cela réduit le code passe-partout et élimine les bugs lors de l'adaptation de l'interface à différents appareils.
Selon Google I/O 2024, Jetpack WindowManager version stable 1.3 inclut la prise en charge des capteurs de charnière, une API pour déterminer l'angle d'ouverture et une intégration améliorée avec Jetpack Compose. La bibliothèque est rétrocompatible jusqu'à Android 10 (API 29) via Support Library et s'adapte automatiquement aux capacités de l'appareil.
FoldingFeature est la classe centrale de Jetpack WindowManager pour travailler avec les appareils pliables. Elle encapsule toutes les informations sur la position physique du pli : état (HALF_OPENED, FLAT, TABLE_TOP), orientation (VERTICAL, HORIZONTAL), coordonnées de la charnière et angle d'ouverture en degrés.
La bibliothèque définit quatre états de pliage. STATE_FLAT — l'appareil est complètement déplié, l'écran est plat. STATE_HALF_OPENED — l'appareil est partiellement plié, l'écran est à un angle de 30 à 160 degrés. STATE_TABLE_TOP — l'appareil est posé sur une surface en posture d'ordinateur portable. STATE_FULLY_OPENED — un état obsolète, remplacé par FLAT dans la version 1.2.
Le pli peut être vertical (VERTICAL_FOLD) ou horizontal (HORIZONTAL_FOLD). Bounds est un rectangle décrivant la zone du pli dans les coordonnées de la fenêtre de l'application. Le développeur utilise ces données pour placer les éléments d'interface au-dessus et en dessous du pli, évitant ainsi le chevauchement du contenu avec la zone critique.
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 est une API pour obtenir les dimensions précises de la fenêtre de l'application, disponible depuis WindowManager 1.0. Contrairement à Display#getSize, WindowMetrics prend en compte le mode multi-fenêtre, DeX et la fenêtre libre. Les métriques retournent currentWindowMetrics (taille actuelle) et maximumWindowMetrics (taille maximale possible sur l'appareil).
WindowSizeClass est un classifieur apparu dans WindowManager 1.1. Il divise les écrans en trois catégories : Compact (largeur inférieure à 600dp — téléphone), Medium (600–840dp — tablette en orientation portrait) et Expanded (plus de 840dp — tablette en paysage). Cette classe simplifie la mise en page adaptative en remplaçant des dizaines de vérifications de taille par une seule classification.
| WindowSizeClass | Largeur d'écran | Appareil exemple | Mise en page recommandée |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Volet unique, navigation inférieure |
| Medium | 600–839dp | Pixel Fold (plié), iPad Mini | Liste-détail, navigation latérale |
| Expanded | 840dp+ | Galaxy Z Fold (déplié), iPad Pro | Multi-volet, rail de navigation |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController est un composant de WindowManager chargé de préserver l'état de l'Activity lors du changement de configuration d'un appareil pliable. Lorsque l'utilisateur déplie ou plie le téléphone, le contrôleur notifie l'application de la nouvelle posture et fournit des mécanismes pour une transition en douceur.
Le contrôleur enregistre des écouteurs via registerContinuityListener, qui accepte un callback avec un objet FoldingFeature. À chaque changement de posture, le callback se déclenche avant la recréation de l'Activity, donnant au développeur la possibilité de sauvegarder l'état manuellement. Si l'application utilise ViewModel, aucun traitement supplémentaire n'est nécessaire — les données sont sauvegardées automatiquement.
Les applications Compose bénéficient de ScreenContinuity via LocalWindowSizeClass et CompositionLocalProvider. Les composants se recomposent automatiquement lorsque WindowMetrics changent. rememberSaveable préserve l'état entre les recompositions, et Modifier.windowInsets prend en compte les zones système de l'écran.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Prenons un exemple complet d'une Activity utilisant Jetpack WindowManager pour adapter l'interface à différentes postures d'un appareil pliable. WindowManagerActivity s'abonne aux changements de FoldingFeature via l'API Flow et alterne entre les mises en page à un et deux volets.
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'exemple montre un scénario de base : l'application vérifie WindowMetrics et sélectionne une mise en page à un ou deux volets. Dans les projets réels, il est recommandé d'utiliser WindowSizeClass pour une adaptation plus flexible et FoldingFeature pour la gestion des appareils pliables. La bibliothèque prend également en charge la transition transparente — une animation fluide lors du changement entre les mises en page.
Android Studio comprend des outils intégrés pour tester Jetpack WindowManager. L'émulateur prend en charge les appareils pliables (Pixel Fold, Galaxy Z Fold) avec changement de posture via l'onglet Folding Postures. Layout Inspector montre les WindowMetrics actuelles et les limites de FoldingFeature en temps réel.
La commande adb shell dumpsys window displays affiche des informations sur tous les écrans connectés et leurs configurations. Pour simuler un pli, utilisez adb shell am broadcast -a android.intent.action.SCREEN_ON avec des paramètres de posture supplémentaires. WindowManager enregistre toutes les modifications de FoldingFeature via WindowManager#logState.
Les principaux problèmes d'intégration — ignorer les mises à jour de WindowMetrics en mode multi-fenêtre, gestion incorrecte des bounds avec un pli vertical et absence de test sur toutes les postures. Il est recommandé de tester chaque posture séparément et de vérifier le comportement lors du passage de l'une à l'autre. L'utilisation de WindowSizeClass au lieu de vérifications manuelles de taille réduit les bugs de 60%.
Foire aux questions
Jetpack WindowManager est disponible à partir d'Android 5.0 (API 21) via Jetpack AndroidX. Cependant, pour le fonctionnement de FoldingFeature et ScreenContinuityController, un appareil avec Android 10+ (API 29) et un pli physique est requis. WindowMetrics fonctionne sur toutes les versions, mais la précision des données dépend du fabricant.
L'API Display est obsolète et ne prend pas en compte les appareils pliables, les modes multi-fenêtre et DeX. WindowManager fournit une API unifiée pour tous les scénarios : FoldingFeature pour les plis, WindowMetrics pour les dimensions précises et WindowSizeClass pour la mise en page adaptative. Display#getSize peut retourner des données incorrectes en multi-fenêtre.
WindowSizeClass remplace des dizaines de vérifications de largeur d'écran par trois catégories : Compact, Medium et Expanded. Au lieu de calculer manuellement les dp et de comparer avec des seuils, le développeur choisit une mise en page pour une catégorie spécifique. Cela simplifie le code, réduit la probabilité d'erreurs et accélère la prise en charge de nouveaux appareils.
Oui, WindowManager est utile même pour les téléphones ordinaires. WindowMetrics fonctionne correctement en mode multi-fenêtre et lors de l'utilisation de DeX. WindowSizeClass aide à adapter l'interface pour les tablettes et les grands écrans. La bibliothèque n'ajoute que 48 Ko à l'APK et n'affecte pas les performances.
Android Emulator avec un AVD comme Pixel Fold ou Galaxy Z Fold simule complètement les opérations de FoldingFeature. Dans Extended Controls, sélectionnez l'onglet Folding Postures et changez les postures. Vous pouvez également utiliser WindowManager Test Kit pour les tests unitaires avec des objets mock de FoldingFeature.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi