Tema escuro

O Android Q oferece um novo tema escuro que se aplica à IU do sistema Android e aos apps em execução no dispositivo.

O tema escuro tem muitos benefícios:

  • Pode reduzir significativamente o consumo de energia (dependendo da tecnologia da tela do dispositivo).
  • Melhora a visibilidade para usuários com baixa visão e aqueles que são sensíveis à luz brilhante.
  • Facilita o uso do dispositivo em um ambiente com pouca luz.

No Android Q, há três maneiras de ativar o tema escuro:

  • Uma nova configuração do sistema (Configurações -> Tela -> Tema) permite que o usuário ative o tema escuro.
  • Um novo bloco de Configurações rápidas permite ao usuário trocar rapidamente os temas da bandeja de notificações (uma vez ativado).
  • Nos dispositivos Pixel, o modo Economia de bateria também ativa o tema escuro ao mesmo tempo. Outros OEMs podem ou não ser compatíveis com esse comportamento.

Compatibilidade com tema escuro no seu app

Para que haja compatibilidade com o tema escuro, você precisa configurar o tema do seu app (normalmente encontrado em res/values/styles.xml) para que herde de um tema DayNight:

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

Você também pode usar os temas escuros do MaterialComponents:

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

Isso vincula o tema principal do app aos sinalizadores do modo noturno controlados pelo sistema e fornece um tema escuro padrão ao app (quando ele está ativado).

Temas e estilos

Seus temas e estilos precisam evitar cores ou ícones codificados para uso com um tema claro. É preciso usar atributos de tema (de preferência) ou recursos qualificados para a noite.

Estes são os dois atributos de tema mais importantes que você precisa conhecer:

  • ?android:attr/textColorPrimary: esta é uma cor de texto para fins gerais. Ela é quase preta no tema claro e quase branca em temas escuros. Ela contém um estado desativado.
  • ?attr/colorControlNormal: uma cor de ícone para fins gerais. Ela 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) deles (como os atributos do tema ?attr/colorSurface e ?attr/colorOnSurface) oferece acesso fácil a cores adequadas. Também é possível personalizar esses atributos no seu tema.

Alterar temas no app

É possível permitir que os usuários alterem o tema do app enquanto ele está em execução. Seu app pode deixar que o usuário escolha entre temas.

Quando o app for executado em dispositivos com o Android 9 ou versões anteriores, as opções de tema recomendadas são:

  • Claro
  • Escuro
  • Definido pela Economia de bateria (opção padrão recomendada)

Quando o app for executado no Android Q, as opções recomendadas são diferentes, permitindo que o usuário substitua o padrão do sistema:

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

Se o usuário selecionar o tema Claro, a Economia de bateria não alterará essa configuração.

Cada uma das opções é mapeada diretamente para um dos modos AppCompat.DayNight:

Para alternar o tema, chame AppCompatDelegate.setDefaultNightMode().

Forçar modo escuro

O Android Q oferece o recurso "Forçar modo escuro" para que os desenvolvedores implementem rapidamente um tema escuro sem configurar explicitamente um tema DayNight, conforme descrito acima.

O recurso "Forçar modo escuro" analisa cada visualização do seu app com tema claro e aplica um tema escuro automaticamente antes do app ser exibido na tela. Alguns desenvolvedores usam 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 "Forçar modo escuro" configurando android:forceDarkAllowed="true" no tema deles. Esse atributo é configurado em todo o sistema e nos temas claros fornecidos no AndroidX, como o Theme.Material.Light. Ao usar o "Forçar modo escuro", é preciso testar seu app completamente e excluir visualizações, se necessário.

Caso seu app use um tema escuro, como Theme.Material, a opção "Forçar modo escuro" não será aplicada. Da mesma forma, se o tema do seu app herdar de um tema DayNight, o recurso "Forçar modo escuro" não será aplicado devido à troca automática de temas.

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

A opção "Forçar modo escuro" pode ser controlada em visualizações específicas, com o atributo de layout android:forceDarkAllowed ou com setForceDarkAllowed().

Práticas recomendadas

Notificações e widgets

Para superfícies de IU que você exibe no dispositivo, mas não controla diretamente, é importante garantir que todas as visualizações usadas reflitam o tema do app host. Dois bons exemplos são as notificações e os widgets da 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 garantir que o estilo de visualização correto seja aplicado.

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

No caso de widgets de tela de início ou de apps com visualizações de notificações personalizadas, é importante testar o conteúdo em temas claros e escuros.

Tenha cuidado com estes erros comuns:

  • Supor que a cor do plano de fundo seja sempre clara
  • Fixar cores do texto no código
  • Definir uma cor de plano de fundo codificada ao usar a cor de texto padrão
  • Usar um ícone drawable que seja uma cor estática

Em todos esses casos, use atributos de tema apropriados em vez de cores codificadas.

Telas iniciais

Se seu app tiver uma tela inicial personalizada, talvez seja necessário modificá-la para que reflita o tema selecionado.

Remova todas as cores codificadas, por exemplo, tudo que aponte para as cores de plano de fundo pode ser branco. Use o atributo de tema ?android:attr/colorBackground.

Os drawables de tema escuro android:windowBackground só funcionam no Android Q.

Alterações de configuração

Quando o tema do app é alterado (por meio da configuração do sistema ou de AppCompat), ele aciona uma alteração de configuração uiMode. Isso significa que as atividades serão recriadas automaticamente.

Em alguns casos, pode ser necessário que um app processe a alteração de configuração. Por exemplo, é recomendável atrasar uma alteração de configuração porque um vídeo está sendo mostrado.

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

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

Quando uma atividade declara que processa alterações de configuração, o método onConfigurationChanged() dela será chamado quando houver uma alteração 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;
    }