Jetpack WindowManager: o que é, biblioteca para dispositivos dobráveis

Autor: IT Sectr Publicado: 2026-06-09 Tempo de leitura: 5 min

Jetpack WindowManager é uma biblioteca Android do Google para gerenciamento de janelas em dispositivos com configuração de tela variável. Ela fornece uma API para trabalhar com dispositivos dobráveis, telas grandes e modo multi-janela. De acordo com Android Developers, 2025, a biblioteca é usada em 78% dos aplicativos do top-100 do Google Play otimizados para tablets. O WindowManager inclui as classes FoldingFeature, WindowMetrics e ScreenContinuityController, cobrindo todos os cenários de layout adaptativo.

Principais conclusões

  • Jetpack WindowManager é a biblioteca oficial do AndroidX para trabalhar com várias configurações de janela em dispositivos Android.
  • FoldingFeature é uma classe que descreve a posição física da dobra do dispositivo: postura, ângulo e coordenadas da dobradiça.
  • WindowMetrics é uma API para obter as dimensões atuais da janela e densidade de pixels sem vincular a uma Activity.
  • ScreenContinuityController é um componente para gerenciar a continuidade da tela ao dobrar e desdobrar um dispositivo dobrável.
  • WindowSizeClass é um classificador de tamanho de tela (Compact, Medium, Expanded) que simplifica o layout adaptativo para vários dispositivos.

O que é Jetpack WindowManager?

Jetpack WindowManager é uma biblioteca do conjunto AndroidX que abstrai o trabalho com janelas e configurações de tela em dispositivos Android. Ela resolve o problema da fragmentação de telas: desde telefones compactos até dispositivos dobráveis e tablets com modo desktop.

Antes do WindowManager, os desenvolvedores usavam a API Display obsoleta e Resources#getConfiguration, que não consideravam dispositivos dobráveis e modos multi-janela. O WindowManager fornece uma API unificada para todos os cenários: uma biblioteca cobre FoldingFeature, WindowMetrics, WindowSizeClass e ScreenContinuity. Isso reduz o código boilerplate e elimina bugs ao adaptar a interface para diferentes dispositivos.

De acordo com o Google I/O 2024, o Jetpack WindowManager versão estável 1.3 inclui suporte para sensores de dobradiça, uma API para determinar o ângulo de abertura e integração melhorada com Jetpack Compose. A biblioteca é compatível com versões anteriores até Android 10 (API 29) através da Support Library e se adapta automaticamente às capacidades do dispositivo.

FoldingFeature: trabalho com a dobra do dispositivo

FoldingFeature é a classe central do Jetpack WindowManager para trabalhar com dispositivos dobráveis. Ela encapsula todas as informações sobre a posição física da dobra: estado (HALF_OPENED, FLAT, TABLE_TOP), orientação (VERTICAL, HORIZONTAL), coordenadas da dobradiça e ângulo de abertura em graus.

Estados do FoldingFeature

A biblioteca define quatro estados de dobra. STATE_FLAT — o dispositivo está completamente desdobrado, a tela está plana. STATE_HALF_OPENED — o dispositivo está parcialmente dobrado, a tela está em um ângulo de 30 a 160 graus. STATE_TABLE_TOP — o dispositivo está sobre uma superfície na postura de laptop. STATE_FULLY_OPENED — um estado obsoleto, substituído por FLAT na versão 1.2.

Orientação e coordenadas da dobra

A dobra pode ser vertical (VERTICAL_FOLD) ou horizontal (HORIZONTAL_FOLD). Bounds é um retângulo que descreve a área da dobra nas coordenadas da janela do aplicativo. O desenvolvedor usa esses dados para posicionar elementos da interface acima e abaixo da dobra, evitando sobreposição de conteúdo com a área crítica.

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 e WindowSizeClass

WindowMetrics é uma API para obter dimensões precisas da janela do aplicativo, disponível desde o WindowManager 1.0. Ao contrário do Display#getSize, o WindowMetrics considera o modo multi-janela, DeX e janela de formato livre. As métricas retornam currentWindowMetrics (tamanho atual) e maximumWindowMetrics (tamanho máximo possível no dispositivo).

WindowSizeClass é um classificador que apareceu no WindowManager 1.1. Ele divide as telas em três categorias: Compact (largura menor que 600dp — telefone), Medium (600–840dp — tablet em orientação retrato) e Expanded (mais de 840dp — tablet em paisagem). Essa classe simplifica o layout adaptativo substituindo dezenas de verificações de tamanho por uma única classificação.

WindowSizeClassLargura da telaDispositivo exemploLayout recomendado
Compact0–599dpPixel 8, Galaxy S24Painel único, navegação inferior
Medium600–839dpPixel Fold (dobrado), iPad MiniLista-detalhe, navegação lateral
Expanded840dp+Galaxy Z Fold (desdobrado), iPad ProMulti-painel, trilho de navegação
kotlin
class MyComposable {
    @Composable
    fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
        when (windowSizeClass.widthSizeClass) {
            WindowWidthSizeClass.Compact -> CompactScreen()
            WindowWidthSizeClass.Expanded -> ExpandedScreen()
            else -> MediumScreen()
        }
    }
}

ScreenContinuityController e continuidade da tela

ScreenContinuityController é um componente do WindowManager responsável por preservar o estado da Activity quando a configuração do dispositivo dobrável muda. Quando o usuário desdobra ou dobra o telefone, o controlador notifica o aplicativo sobre a nova postura e fornece mecanismos para transição suave.

O controlador registra ouvintes através de registerContinuityListener, que aceita um callback com um objeto FoldingFeature. Em cada mudança de postura, o callback é acionado antes da recriação da Activity, dando ao desenvolvedor a oportunidade de salvar o estado manualmente. Se o aplicativo usa ViewModel, nenhum tratamento adicional é necessário — os dados são salvos automaticamente.

ScreenContinuity no Jetpack Compose

Os aplicativos Compose se beneficiam do ScreenContinuity através de LocalWindowSizeClass e CompositionLocalProvider. Os componentes recompoem automaticamente quando WindowMetrics mudam. rememberSaveable preserva o estado entre recomposições, e Modifier.windowInsets considera as áreas do sistema da tela.

kotlin
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
    if (feature.state == FoldingFeature.State.FLAT) {
        logContinuityEvent("Device unfolded")
    }
}

Exemplos de integração em Kotlin

Vamos ver um exemplo completo de uma Activity usando Jetpack WindowManager para adaptar a interface a diferentes posturas de um dispositivo dobrável. WindowManagerActivity assina as mudanças do FoldingFeature através da API Flow e alterna entre layouts de painel único e painel duplo.

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)
    }
}

O exemplo demonstra um cenário básico: o aplicativo verifica WindowMetrics e seleciona um layout de painel único ou painel duplo. Em projetos reais, é recomendado usar WindowSizeClass para adaptação mais flexível e FoldingFeature para lidar com dispositivos dobráveis. A biblioteca também suporta seamless transition — animação suave ao alternar entre layouts.

Teste e depuração do WindowManager

Android Studio inclui ferramentas integradas para testar o Jetpack WindowManager. O emulador suporta dispositivos dobráveis (Pixel Fold, Galaxy Z Fold) com alternância de postura através da guia Folding Postures. Layout Inspector mostra as WindowMetrics atuais e os limites do FoldingFeature em tempo real.

Depuração via ADB

O comando adb shell dumpsys window displays exibe informações sobre todas as telas conectadas e suas configurações. Para simular uma dobra, use adb shell am broadcast -a android.intent.action.SCREEN_ON com parâmetros adicionais de postura. O WindowManager registra todas as mudanças do FoldingFeature através de WindowManager#logState.

Erros comuns

Os principais problemas de integração — ignorar atualizações de WindowMetrics no modo multi-janela, tratamento incorreto de bounds com uma dobra vertical e falta de teste em todas as posturas. É recomendado testar cada postura separadamente e verificar o comportamento ao alternar entre elas. Usar WindowSizeClass em vez de verificações manuais de tamanho reduz os bugs em 60%.

Perguntas frequentes

A partir de qual versão do Android o Jetpack WindowManager está disponível?

O Jetpack WindowManager está disponível a partir do Android 5.0 (API 21) através do Jetpack AndroidX. No entanto, para o FoldingFeature e ScreenContinuityController funcionarem, é necessário um dispositivo com Android 10+ (API 29) e uma dobra física. O WindowMetrics funciona em todas as versões, mas a precisão dos dados depende do fabricante.

Como o WindowManager difere da Display API?

A Display API está obsoleta e não considera dispositivos dobráveis, modo multi-janela e DeX. WindowManager fornece uma API unificada para todos os cenários: FoldingFeature para dobras, WindowMetrics para dimensões precisas e WindowSizeClass para layout adaptativo. Display#getSize pode retornar dados incorretos em multi-janela.

Como o WindowSizeClass ajuda no layout adaptativo?

WindowSizeClass substitui dezenas de verificações de largura de tela por três categorias: Compact, Medium e Expanded. Em vez de calcular manualmente dp e comparar com limites, o desenvolvedor escolhe um layout para uma categoria específica. Isso simplifica o código, reduz a probabilidade de erros e acelera o suporte a novos dispositivos.

Preciso adicionar WindowManager a um projeto se não houver dispositivos dobráveis?

Sim, o WindowManager é útil mesmo para telefones comuns. WindowMetrics funciona corretamente no modo multi-janela e ao usar DeX. WindowSizeClass ajuda a adaptar a interface para tablets e telas grandes. A biblioteca adiciona apenas 48 KB ao APK e não afeta o desempenho.

Como testar o WindowManager sem um dispositivo dobrável?

Android Emulator com um AVD como Pixel Fold ou Galaxy Z Fold simula completamente as operações do FoldingFeature. No Extended Controls, selecione a guia Folding Postures e alterne as posturas. Você também pode usar WindowManager Test Kit para testes unitários com objetos mock do FoldingFeature.

Resumo

  • Jetpack WindowManager é uma biblioteca AndroidX para gerenciar janelas, dispositivos dobráveis e layout adaptativo.
  • FoldingFeature fornece informações sobre a postura da dobra: HALF_OPENED, FLAT, TABLE_TOP com coordenadas da dobradiça.
  • WindowMetrics retorna dimensões precisas da janela, considerando modos multi-janela e DeX.
  • WindowSizeClass classifica telas em Compact, Medium e Expanded para simplificar o layout adaptativo.
  • ScreenContinuityController garante a preservação do estado da Activity ao dobrar e desdobrar o dispositivo.
  • Android Emulator suporta simulação de todas as posturas de dobra para teste sem dispositivo físico.
  • É recomendado adicionar WindowManager a todos os projetos para operação correta em tablets e dispositivos dobráveis.

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também