Alerta Android 15: O Fim do setStatusBarColor e setNavigationBarColor

Leitura de 6 min
Android
Build
ToolBar
Alerta Android 15: O Fim do setStatusBarColor e setNavigationBarColor

Android 15 e o Fim das Barras Coloridas: Guia Completo de Migração para a Era Edge-to-Edge Obrigatória

Com o lançamento do Android 15 (API level 35), o Google está impondo uma mudança significativa na forma como os aplicativos interagem com a interface do sistema. A era da configuração manual de cores para as barras de status e navegação está chegando ao fim. O futuro é, inequivocamente, a exibição "ponta a ponta" (Edge-to-Edge).

Este artigo exaustivo detalha o que mudou, por que essas APIs foram descontinuadas, como identificar o impacto no seu código (especialmente com componentes do Material Design) e, o mais importante, como migrar corretamente para garantir a compatibilidade e uma experiência de usuário moderna.


1. O Contexto: Por que o Android 15 Impõe o Edge-to-Edge?

Desde o Android 10 (API level 29) e a introdução da navegação por gestos, o Google vem incentivando os desenvolvedores a adotar o modo Edge-to-Edge. O objetivo é simples: permitir que o conteúdo do aplicativo flua sob as barras de sistema (status e navegação), aproveitando cada pixel da tela moderna e proporcionando uma experiência mais imersiva.

No Android 15, essa recomendação tornou-se uma exigência. Para aplicativos que visam o SDK 35 ou superior, o sistema ativa automaticamente o modo Edge-to-Edge. Isso significa que o sistema agora gerencia a transparência e a aparência das barras para garantir contraste e visibilidade, independentemente do que o aplicativo tente configurar.

O principal motivo dessa mudança é a consistência da experiência do usuário e a manutenibilidade do sistema. A complexidade de gerenciar cores, contrastes e visibilidade de ícones em milhares de dispositivos e temas diferentes tornou as APIs manuais um fardo para o sistema e uma fonte frequente de bugs visuais nos aplicativos.

2. As APIs Descontinuadas: O Que Você Não Pode Mais Usar

O aviso que você recebeu é claro. As seguintes APIs clássicas foram descontinuadas e não terão efeito no Android 15 (SDK 35+):

🚫 android.view.Window.setStatusBarColor(int color)

Usada anteriormente para definir uma cor sólida e manual para a barra de status no topo da tela.

🚫 android.view.Window.setNavigationBarColor(int color)

Usada anteriormente para definir uma cor sólida e manual para a barra de navegação (seja de três botões ou de gestos) na parte inferior da tela.

🚫 Atributos de Tema Relacionados

  • android:statusBarColor
  • android:navigationBarColor
  • android:windowTranslucentStatus (e Navigation)

O que acontece no Android 15? Se o seu app visar o SDK 35, o Android ignorará as cores que você definiu e forçará as barras a serem transparentes ou a usar a proteção automática do sistema (uma scrim leve). Tentar forçar uma cor agora é inútil.

3. Fontes Comuns do Problema: O Papel das Bibliotecas de Terceiros

Muitas vezes, o seu código não chama essas APIs diretamente. O aviso pode apontar para bibliotecas populares que ainda não foram totalmente atualizadas ou que implementam soluções de retrocompatibilidade complexas. O relatório de aviso que você recebeu menciona explicitamente:

  1. com.google.android.material.bottomsheet.BottomSheetDialog.onCreate
  2. com.google.android.material.internal.EdgeToEdgeUtils.applyEdgeToEdge
  3. com.google.android.material.sidesheet.SheetDialog.onCreate

Esses componentes do Material Components for Android historicamente tentaram gerenciar a aparência das barras de sistema para garantir que os diálogos (como BottomSheet) parecessem corretos. Se você usa essas bibliotecas, a correção imediata é:

  • Atualize o Material Components: Certifique-se de estar usando a versão mais recente e estável da biblioteca Material Components (atualmente 1.11.0 ou superior). O Google está atualizando ativamente essas classes para se adaptar ao Android 15.

Mesmo atualizando as bibliotecas, você deve auditar seu código para garantir que você não esteja interferindo manualmente nesses componentes após a criação.

4. O Guia de Migração: Passos Práticos para a Era Edge-to-Edge

A migração envolve três pilares: remover o código antigo, ativar o modo Edge-to-Edge de forma compatível e gerenciar o espaçamento (insets).

Passo 1: Limpeza do Código Antigo e do Tema

Remova todas as chamadas para as APIs descontinuadas. Isso inclui:

  • Código Java/Kotlin: Delete todas as instâncias de window.setStatusBarColor(...) e window.setNavigationBarColor(...).
  • Temas XML (styles.xml / themes.xml): Remova ou defina como transparente os atributos:
    <item name="android:statusBarColor">@android:color/transparent</item>
    <item name="android:navigationBarColor">@android:color/transparent</item>
    

Passo 2: Ativação Manual (Para Retrocompatibilidade)

No Android 15 (SDK 35+), o Edge-to-Edge é automático. No entanto, para que o seu app tenha a mesma aparência imersiva no Android 14 (SDK 34) e inferiores, você deve ativá-lo manualmente. A maneira mais limpa e compatível é usando a biblioteca androidx.core:core (v1.12.0+).

Adicione à sua Activity.onCreate(), antes de chamar setContentView():

import androidx.activity.enableEdgeToEdge
// ...

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    
    // ATIVAÇÃO COMPATÍVEL:
    // Esta função lida com as complexidades entre Android 10 e 14.
    // No Android 15, ela não faz nada (pois já está ativado).
    enableEdgeToEdge()
    
    setContentView(R.layout.activity_main)
    // ...
}

Passo 3: O Ponto Fundamental – Gerenciamento de WindowInsets

Este é o passo mais crucial. Ao permitir que o conteúdo flua sob as barras de sistema, elementos de UI importantes (como botões, textos ou a sua barra de ferramentas) podem ficar ocultos ou sobrepostos.

A solução não é adicionar margens fixas. A solução correta é usar WindowInsets. Eles informam exatamente o tamanho das barras de sistema para que você possa ajustar o espaçamento (padding) dinamicamente.

Aqui está como fazer isso de forma programática:

import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
// ...

val mainLayout: View = findViewById(R.id.main_layout_id)

ViewCompat.setOnApplyWindowInsetsListener(mainLayout) { view, windowInsets ->
    // Captura os insets correspondentes às barras de sistema
    val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars())
    
    // Aplica os insets como padding para evitar sobreposição.
    // Isso mantém o conteúdo visualmente centralizado entre as barras.
    // NOTA: updatePadding é uma função de extensão do androidx.core.view
    view.updatePadding(
        left = insets.left,
        top = insets.top,
        right = insets.right,
        bottom = insets.bottom
    )
    
    // Retorna o insets original para que outros componentes 
    // também possam usá-lo se necessário.
    windowInsets
}

5. Casos Especiais e Estratégias Avançadas

Gerenciando Contrastes e Visibilidade de Ícones

O sistema Android 15 cuida automaticamente de ajustar as cores dos ícones (tornando-os escuros em fundos claros e claros em fundos escuros) para barras de sistema transparentes.

Se você estiver em uma versão anterior do Android (10-14) e precisar controlar isso, você deve usar WindowInsetsControllerCompat.

import androidx.core.view.WindowInsetsControllerCompat
// ...

val windowInsetsController = WindowInsetsControllerCompat(window, window.decorView)

// Para Android 14 e inferiores:
// Se o seu conteúdo de fundo for CLARO, os ícones devem ser ESCUROS.
windowInsetsController.isAppearanceLightStatusBars = true
//windowInsetsController.isAppearanceLightNavigationBars = true 

Usando Componentes do Material Design 3

O Material Design 3 (M3) foi projetado pensando no Edge-to-Edge. Componentes como TopAppBar, BottomNavigationView e NavigationDrawer gerenciam internamente os WindowInsets e o contraste, desde que o tema do seu aplicativo herde de um tema Material 3.

<style name="Theme.MyApp" parent="Theme.Material3.DayNight.NoActionBar">
    </style>

Se o seu app já usa Material 3, a migração será muito mais suave, exigindo apenas a ativação com enableEdgeToEdge() e a remoção das cores legadas.

Conclusão

A descontinuação de setStatusBarColor e setNavigationBarColor no Android 15 não é uma penalidade, mas uma evolução necessária da plataforma em direção a interfaces mais consistentes, modernas e imersivas. Embora exija refatoração, a mudança para o gerenciamento dinâmico via WindowInsets simplifica a manutenção a longo prazo e entrega uma experiência superior para o usuário.

O caminho das pedras:

  1. Atualize o Material Components.
  2. Limpe as chamadas de cores fixas no código e XML.
  3. Use enableEdgeToEdge() na Activity.
  4. Implemente listeners de WindowInsets para gerenciar o espaçamento da UI.

Discussão (...)

Deixe um comentário
Você precisa fazer login para comentar.
?

Carregando comentários...

Artigos Relacionados

O que é um build?
Tecnologia

O que é um build?

ENEugénio Nelson 26 mar, 2026

Os aplicativos Android geralmente são criados usando o sistema de build Gradle. Antes de detalhar como configurar seu build, vamos conhecer os conceit...