Tema escuro

O tema escuro está disponível no Android 10 (nível de API 29) e em versões posteriores. Ele tem diversos benefícios:

  • É capaz de reduzir o uso de energia em uma quantidade significativa (dependendo da tecnologia da tela do dispositivo).
  • Melhora a visibilidade para usuários com problemas de visão e que tenham sensibilidade ao brilho da luz.
  • Facilita que o dispositivo seja usado por todos em um ambiente de pouca luz.

O tema escuro se aplica à IU do sistema Android e aos aplicativos que operam no dispositivo.

Há três maneiras de ativar o tema escuro no Android 10 (nível de API 29) e em versões posteriores:

  • Usar a configuração do sistema (Configurações -> Tela -> Tema) para ativar o tema escuro.
  • Usar o bloco de configurações rápidas para trocar os temas na bandeja de notificação (após a ativação).
  • Em dispositivos Pixel, ao selecionar o modo Economia de bateria, o tema escuro é ao mesmo tempo ativado. Outros OEMs podem ou não oferecer suporte a esse comportamento.

Compatibilidade com o tema escuro no seu aplicativo

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

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

Também é possível usar o tema escuro do MaterialComponents:

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

Isso vincula o tema principal do aplicativo aos sinalizadores do modo noturno controlado pelo sistema e oferece ao aplicativo um tema escuro padrão (quando ativado).

Temas e estilos

Nos seus temas e estilos, evite usar cores ou ícones codificados para uso em um tema claro. Em vez disso, use atributos de tema (de preferência) ou recursos qualificados para a noite.

Estes são os dois atributos de tema mais importantes:

  • ?android:attr/textColorPrimary Trata-se de uma cor de texto de uso geral. Quase preto no tema claro e quase branco nos temas escuros. Ele contém um estado desativado.
  • ?attr/colorControlNormal É uma cor de ícone de uso geral. Ele contém um estado desativado.

Recomendamos o uso de componentes do Material Design. Eles têm um sistema de temas coloridos (como os atributos do tema ?attr/colorSurface e ?attr/colorOnSurface) que oferece fácil acesso a cores adequadas. Obviamente, esses atributos podem ser personalizados no seu tema.

Alteração de temas no aplicativo

Pode ser que você queira permitir que os usuários alterem o tema do aplicativo durante a execução. Seu aplicativo pode deixar que o usuário escolha entre os temas.

Ao executar em dispositivos que operam no Android 9 ou versões anteriores, estas são as opções de tema recomendadas:

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

Ao operar no Android 10 (nível de API 29) e em versões posteriores, as opções recomendadas são diferentes para permitir que o usuário modifique o padrão do sistema:

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

Caso o usuário selecione o tema claro e, em seguida, a Economia de bateria, a configuração não será alterada.

Cada opção mapeia diretamente a um dos modos AppCompat.DayNight:

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

Force Dark

O Android 10 oferece o Force Dark, um recurso para desenvolvedores implementarem rapidamente um tema escuro sem configurar um tema DayNight de forma explícita, como descrito acima.

O Force Dark analisa cada visualização do seu aplicativo com tema claro e aplica automaticamente um tema escuro antes de ele ser desenhado na tela. Alguns desenvolvedores usam uma combinação do Force Dark e da implementação nativa para reduzir o tempo necessário para implementar o tema escuro.

Os aplicativos precisam ativar o Force Dark por meio da configuração de android:forceDarkAllowed="true" no tema do aplicativo. Esse atributo é definido em todos os temas claros fornecidos pelo sistema e pelo AndroidX, como Theme.Material.Light. Ao usar o Force Dark, teste minuciosamente seu aplicativo e exclua as visualizações conforme necessário.

Caso o aplicativo use um tema escuro (como Theme.Material), o Force Dark não será aplicado. De modo semelhante, se o tema do aplicativo for herdado de um tema DayNight, o Force Dark não será aplicado, devido à troca automática de temas.

Como desativar o Force Dark em uma visualização

O Force Dark pode ser controlado em visualizações específicas com 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 que não controla diretamente, é importante verificar se as visualizações usadas refletem o tema do aplicativo host. Dois bons exemplos são as notificações e os 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 garantir que o estilo de visualização correto está aplicado.

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

Para os widgets na tela de início ou caso o aplicativo use visualizações de conteúdo de notificação personalizado, é importante testar o conteúdo nos temas claro e escuro.

Tome cuidado com os erros mais comuns:

  • Supor que a cor em segundo plano seja sempre clara
  • Codificar as cores do texto
  • Configurar uma cor em segundo plano codificada e usar a cor de texto padrão ao mesmo tempo
  • Usar um ícone drawable que seja uma cor estática

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

Telas de inicialização

Caso seu aplicativo tenha uma tela de inicialização personalizada, pode ser necessário que ela seja modificada para refletir o tema selecionado.

Remova todas as cores codificadas. Por exemplo, todas as cores brancas em segundo plano. Em vez disso, use o atributo de tema ?android:attr/colorBackground.

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

Alterações de configuração

Quando o tema do aplicativo é alterado (pela configuração do sistema ou pelo AppCompat), uma alteração da configuração uiMode é acionada. Isso significa que as atividades serão recriadas automaticamente.

Em alguns casos, convém que um aplicativo gerencie a alteração da configuração. Por exemplo, você pode querer atrasar a alteração de uma configuração devido à reprodução de um vídeo.

Um aplicativo pode gerenciar a implementação do tema escuro por si só. Para isso, ele precisa declarar que cada atividade é capaz de processar a alteração da configuração uiMode:

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

Quando uma atividade declarar que pode gerenciar as alterações de configuração, o método onConfigurationChanged() dela será chamado no momento em que houver uma mudança de tema.

Para verificar qual o tema atual, os aplicativos podem executar um código 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;
}