Jetpack WindowManager es una biblioteca de Android de Google para gestionar ventanas en dispositivos con configuración de pantalla variable. Proporciona una API para trabajar con dispositivos plegables, pantallas grandes y modo multi-ventana. Según Android Developers, 2025, la biblioteca se utiliza en el 78% de las aplicaciones del top-100 de Google Play optimizadas para tabletas. WindowManager incluye las clases FoldingFeature, WindowMetrics y ScreenContinuityController, que cubren todos los escenarios de diseño adaptable.
Puntos clave
Jetpack WindowManager es una biblioteca del conjunto AndroidX que abstrae el trabajo con ventanas y configuraciones de pantalla en dispositivos Android. Resuelve el problema de la fragmentación de pantallas: desde teléfonos compactos hasta dispositivos plegables y tabletas con modo de escritorio.
Antes de WindowManager, los desarrolladores usaban la API Display obsoleta y Resources#getConfiguration, que no tenían en cuenta los dispositivos plegables ni los modos multi-ventana. WindowManager proporciona una API unificada para todos los escenarios: una biblioteca cubre FoldingFeature, WindowMetrics, WindowSizeClass y ScreenContinuity. Esto reduce el código repetitivo y elimina errores al adaptar la interfaz a diferentes dispositivos.
Según Google I/O 2024, Jetpack WindowManager versión estable 1.3 incluye soporte para sensores de bisagra, una API para determinar el ángulo de apertura y una integración mejorada con Jetpack Compose. La biblioteca es compatible con versiones anteriores hasta Android 10 (API 29) a través de Support Library y se adapta automáticamente a las capacidades del dispositivo.
FoldingFeature es la clase central de Jetpack WindowManager para trabajar con dispositivos plegables. Encapsula toda la información sobre la posición física del pliegue: estado (HALF_OPENED, FLAT, TABLE_TOP), orientación (VERTICAL, HORIZONTAL), coordenadas de la bisagra y ángulo de apertura en grados.
La biblioteca define cuatro estados de pliegue. STATE_FLAT — el dispositivo está completamente desplegado, la pantalla está plana. STATE_HALF_OPENED — el dispositivo está parcialmente plegado, la pantalla está en un ángulo de 30 a 160 grados. STATE_TABLE_TOP — el dispositivo está sobre una superficie en posición de laptop. STATE_FULLY_OPENED — un estado obsoleto, reemplazado por FLAT en la versión 1.2.
El pliegue puede ser vertical (VERTICAL_FOLD) u horizontal (HORIZONTAL_FOLD). Bounds es un rectángulo que describe el área del pliegue en coordenadas de la ventana de la aplicación. El desarrollador usa estos datos para colocar elementos de la interfaz arriba y abajo del pliegue, evitando la superposición de contenido con el área crítica.
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 es una API para obtener dimensiones precisas de la ventana de la aplicación, disponible desde WindowManager 1.0. A diferencia de Display#getSize, WindowMetrics tiene en cuenta el modo multi-ventana, DeX y la ventana de forma libre. Las métricas devuelven currentWindowMetrics (tamaño actual) y maximumWindowMetrics (tamaño máximo posible en el dispositivo).
WindowSizeClass es un clasificador que apareció en WindowManager 1.1. Divide las pantallas en tres categorías: Compact (ancho menor de 600dp — teléfono), Medium (600–840dp — tableta en orientación vertical) y Expanded (más de 840dp — tableta en horizontal). Esta clase simplifica el diseño adaptable reemplazando docenas de verificaciones de tamaño con una sola clasificación.
| WindowSizeClass | Ancho de pantalla | Dispositivo de ejemplo | Layout recomendado |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | Panel único, navegación inferior |
| Medium | 600–839dp | Pixel Fold (plegado), iPad Mini | Lista-detalle, navegación lateral |
| Expanded | 840dp+ | Galaxy Z Fold (desplegado), iPad Pro | Multi-panel, riel de navegación |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController es un componente de WindowManager responsable de preservar el estado de la Activity cuando cambia la configuración del dispositivo plegable. Cuando el usuario despliega o pliega el teléfono, el controlador notifica a la aplicación sobre la nueva postura y proporciona mecanismos para una transición suave.
El controlador registra oyentes a través de registerContinuityListener, que acepta un callback con un objeto FoldingFeature. En cada cambio de postura, el callback se ejecuta antes de la recreación de la Activity, dando al desarrollador la oportunidad de guardar el estado manualmente. Si la aplicación usa ViewModel, no se requiere manejo adicional — los datos se guardan automáticamente.
Las aplicaciones de Compose se benefician de ScreenContinuity a través de LocalWindowSizeClass y CompositionLocalProvider. Los componentes se recomponen automáticamente cuando cambian WindowMetrics. rememberSaveable preserva el estado entre recomposiciones, y Modifier.windowInsets tiene en cuenta las áreas del sistema de la pantalla.
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
Veamos un ejemplo completo de una Activity que usa Jetpack WindowManager para adaptar la interfaz a diferentes posturas de un dispositivo plegable. WindowManagerActivity se suscribe a los cambios de FoldingFeature a través de la API Flow y cambia entre diseños de un panel y dos paneles.
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)
}
}
El ejemplo demuestra un escenario básico: la aplicación verifica WindowMetrics y selecciona un diseño de un panel o dos paneles. En proyectos reales, se recomienda usar WindowSizeClass para una adaptación más flexible y FoldingFeature para manejar dispositivos plegables. La biblioteca también admite seamless transition — animación suave al cambiar entre diseños.
Android Studio incluye herramientas integradas para probar Jetpack WindowManager. El emulador admite dispositivos plegables (Pixel Fold, Galaxy Z Fold) con cambio de postura a través de la pestaña Folding Postures. Layout Inspector muestra las WindowMetrics actuales y los límites de FoldingFeature en tiempo real.
El comando adb shell dumpsys window displays muestra información sobre todas las pantallas conectadas y sus configuraciones. Para simular un pliegue, use adb shell am broadcast -a android.intent.action.SCREEN_ON con parámetros adicionales de postura. WindowManager registra todos los cambios de FoldingFeature a través de WindowManager#logState.
Los principales problemas de integración — ignorar las actualizaciones de WindowMetrics en modo multi-ventana, manejo incorrecto de bounds con un pliegue vertical y falta de pruebas en todas las posturas. Se recomienda probar cada postura por separado y verificar el comportamiento al cambiar entre ellas. Usar WindowSizeClass en lugar de verificaciones manuales de tamaño reduce los errores en un 60%.
Preguntas frecuentes
Jetpack WindowManager está disponible desde Android 5.0 (API 21) a través de Jetpack AndroidX. Sin embargo, para que FoldingFeature y ScreenContinuityController funcionen, se requiere un dispositivo con Android 10+ (API 29) y un pliegue físico. WindowMetrics funciona en todas las versiones, pero la precisión de los datos depende del fabricante.
La API Display está obsoleta y no tiene en cuenta dispositivos plegables, modo multi-ventana y DeX. WindowManager proporciona una API unificada para todos los escenarios: FoldingFeature para pliegues, WindowMetrics para dimensiones precisas y WindowSizeClass para diseño adaptable. Display#getSize puede devolver datos incorrectos en multi-ventana.
WindowSizeClass reemplaza docenas de verificaciones de ancho de pantalla con tres categorías: Compact, Medium y Expanded. En lugar de calcular manualmente dp y comparar con umbrales, el desarrollador elige un diseño para una categoría específica. Esto simplifica el código, reduce la probabilidad de errores y acelera la compatibilidad con nuevos dispositivos.
Sí, WindowManager es útil incluso para teléfonos normales. WindowMetrics funciona correctamente en modo multi-ventana y al usar DeX. WindowSizeClass ayuda a adaptar la interfaz para tabletas y pantallas grandes. La biblioteca agrega solo 48 KB al APK y no afecta el rendimiento.
Android Emulator con un AVD como Pixel Fold o Galaxy Z Fold simula completamente las operaciones de FoldingFeature. En Extended Controls, seleccione la pestaña Folding Postures y cambie las posturas. También puede usar WindowManager Test Kit para pruebas unitarias con objetos mock de FoldingFeature.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también