Implementar o tema escuro

Teste o Compose
O Jetpack Compose é o kit de ferramentas de interface recomendado para Android. Aprenda a trabalhar com temas no Compose.

Figura 1. Tema escuro.

O tema escuro está disponível no Android 10 (API de nível 29) e versões mais recentes. Ele tem os seguintes benefícios:

  • Reduz o uso de energia em uma quantidade significativa, dependendo da tecnologia da tela do dispositivo.
  • Melhora a visibilidade para usuários com baixa visão e para aqueles sensíveis a luzes intensas.
  • Facilita o uso do dispositivo em um ambiente com pouca luz.

O tema escuro se aplica à interface do sistema Android e aos apps em execução no dispositivo.

Há três maneiras de ativar o tema escuro no Android 10 e versões mais recentes:

  • Use a configuração do sistema acessando Configurações > Tela > Tema para ativar o tema escuro.
  • Use o bloco "Configurações rápidas" para trocar de tema na bandeja de notificações quando ativado.
  • Em dispositivos Pixel, ative o modo Economia de bateria para ativar o tema escuro ao mesmo tempo. Outros dispositivos podem não ser compatíveis com esse comportamento.

Para ver instruções sobre como aplicar um tema escuro ao conteúdo baseado na Web usando um componente WebView, consulte Escurecer conteúdo da Web com WebView.

Oferecer suporte ao tema escuro no app

Para oferecer suporte ao tema escuro, configure o tema do seu app, normalmente encontrado em res/values/styles.xml, para herdar de um tema DayNight:

<style name="AppTheme" parent="Theme.AppCompat.DayNight">

Você também pode usar o tema escuro dos componentes do Material Design:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">

Isso vincula o tema principal do app às sinalizações do modo noturno controladas pelo sistema e fornece ao app um tema escuro padrão quando ele está ativado.

Temas e estilos

Evite usar cores ou ícones fixados no código para uso com um tema claro. Use atributos de tema ou recursos qualificados para a noite.

Dois atributos do tema são mais importantes para o tema escuro:

  • ?android:attr/textColorPrimary: uma cor de texto para fins gerais. Ele é quase preto no tema claro e quase branco nos temas escuros. Contém um estado desativado.
  • ?attr/colorControlNormal: uma cor de ícone de uso geral. Contém um estado desativado.

Recomendamos o uso dos componentes do Material Design, já que o sistema de temas de cores (links em inglês), como os atributos de tema ?attr/colorSurface e ?attr/colorOnSurface, oferece acesso fácil a cores adequadas. Você pode personalizar esses atributos no seu tema.

Mudar temas no app

Você pode permitir que os usuários mudem o tema do app enquanto ele está em execução. Veja a seguir as opções recomendadas:

  • Claro
  • Escuro
  • Padrão do sistema (opção padrão recomendada)

Essas opções são mapeadas diretamente para os modos AppCompat.DayNight:

Para trocar o tema, faça o seguinte:

Forçar modo escuro

O Android 10 oferece o recurso Forçar modo escuro para os desenvolvedores implementarem rapidamente um tema escuro sem definir explicitamente um tema DayNight.

O recurso Forçar modo escuro analisa cada visualização do app com tema claro e aplica um tema escuro automaticamente antes de o app ser exibido na tela. Você pode usar uma combinação de Forçar modo escuro e implementação nativa para reduzir o tempo necessário para implementar o tema escuro.

Os apps precisam ativar o recurso Forçar modo escuro definindo android:forceDarkAllowed="true" no tema da atividade. Esse atributo é definido em todos os temas claros fornecidos pelo sistema e pelo AndroidX, como Theme.Material.Light. Ao usar o recurso "Forçar modo escuro", teste o app completamente e exclua visualizações conforme necessário.

Se o app usar um tema escuro, como Theme.Material, o Forçar modo escuro não será aplicado. Da mesma forma, se o tema do app for herdado de um tema DayNight, o recurso Forçar escuro não será aplicado devido à troca automática de temas.

Desativar o Forçar modo escuro em uma visualização

O recurso Forçar modo escuro pode ser controlado em visualizações específicas com o atributo de layout android:forceDarkAllowed ou com setForceDarkAllowed().

Conteúdo da Web

Para ver informações sobre como usar temas escuros no conteúdo baseado na Web, consulte Escurecer conteúdo da Web com WebView. Para conferir um exemplo do tema escuro aplicado a uma WebView, consulte a demonstração do WebView no GitHub (link em inglês).

Práticas recomendadas

As seções a seguir demonstram as práticas recomendadas para implementar temas escuros.

Notificações e widgets

Para superfícies de interface que você exibe no dispositivo, mas não controla diretamente, verifique se todas as visualizações usadas refletem o tema do app host. Dois exemplos são notificações e widgets na tela de início.

Notificações

Use os modelos de notificação fornecidos pelo sistema, como MessagingStyle. Isso significa que o sistema é responsável por aplicar o estilo de visualização correto.

Widgets e visualizações de notificações personalizadas

Para widgets de tela de início ou se o app usa visualizações personalizadas de conteúdo de notificação, teste o conteúdo nos temas claro e escuro.

Confira algumas armadilhas comuns:

  • Supondo que a cor de fundo seja sempre clara.
  • Fixar as cores do texto no código.
  • Definir uma cor de plano de fundo fixada no código usando a cor de texto padrão.
  • Usar um ícone drawable que tem uma cor estática.

Em todos esses casos, use atributos de tema adequados em vez de cores fixadas no código.

Telas de inicialização

Se o app tiver uma tela de inicialização personalizada, talvez seja necessário modificá-la para que reflita o tema selecionado.

Remova todas as cores fixadas no código, como as cores de fundo definidas de maneira programática como brancas. Em vez disso, use o atributo de tema ?android:attr/colorBackground.

Mudanças de configuração

Quando o tema do app muda, seja pela configuração do sistema ou pelo AppCompat, ele aciona uma mudança de configuração uiMode. Isso significa que as atividades são recriadas automaticamente.

Em alguns casos, é possível que você queira que um app processe a mudança de configuração. Por exemplo, é recomendável atrasar uma mudança de configuração quando um vídeo está sendo exibido.

Um app pode processar a implementação do tema escuro declarando que cada Activity pode processar a mudança de configuração uiMode:

<activity
    android:name=".MyActivity"
    android:configChanges="uiMode" />

Quando um Activity declara que processa mudanças de configuração, o método onConfigurationChanged() é chamado quando há uma mudança de tema.

Para verificar qual é o tema atual, os apps podem executar códigos como este:

Kotlin

val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {} // Night mode is not active, we're using the light theme.
    Configuration.UI_MODE_NIGHT_YES -> {} // Night mode is active, we're using dark theme.
}

Java

int currentNightMode = configuration.uiMode & Configuration.UI_MODE_NIGHT_MASK;
switch (currentNightMode) {
    case Configuration.UI_MODE_NIGHT_NO:
        // Night mode is not active, we're using the light theme
        break;
    case Configuration.UI_MODE_NIGHT_YES:
        // Night mode is active, we're using dark theme
        break;
}