ContextCompat.getColor () ignora NightMode

9

TL, DR;

ContextCompat.getColor()não usa as cores noturnas ( values-night/colors.xml) como deveria quando o modo noturno está ativado.

Aqui está o problema:

Olá a todos,

Então, estou implementando um tema sombrio para o meu aplicativo Android. Chamo isso para ativá-lo: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

Eu configurei as cores values/colors.xmle a versão está escura values-night/colors.xml. As cores mudam bem, dependendo do nightMode, MAS:

quando uso ContextCompat.getColor(getApplicationContext(), R.id.myColor), usa as cores normais ( values/colors.xml) e não as noturnas ( values-night/colors.xml).

No meu build.gradle, eu defini estes:

implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0-beta01'

Alguém poderia me dizer o que estou fazendo de errado?

PS: Eu já olhei para a seguinte pergunta e ela não responde a esse problema /programming/57779661/contextcompat-getcolor-method-ignores-night-mode

Mathieu de Brito
fonte
1
Não consigo reproduzi-lo, estou usando o appcompat 1.1.0 e as duas cores do XML e ContextCompat.getColor()retornamos valores válidos depois de forçar o modo noturno. Você pode elaborar sua pergunta com um trecho de código (quando você altera o modo noturno / obtém a cor)?
Pawel
1
Você provavelmente está passando um contexto inválido (ApplicationContext, por exemplo) para getColor. Você poderia compartilhar como você chama getColor?
W0rmH0le 10/10/19
@ W0rmH0le sim, eu estava passando um ApplicationContext, não sabia que precisava usar a atividade para que isso funcionasse! Poderia, por favor, dar isso como uma resposta oficial, para que eu possa marcar sua resposta como válida?
Mathieu de Brito
@Pawel Obrigado pelo seu feedback, ele me ajudou a saber que era um bug no meu código :) #
Mathieu de Brito
Ainda bem que pude ajudar! Eu enfrentei problemas semelhantes ... No final, eu estava usando contexto de aplicação como você
W0rmH0le

Respostas:

12

Eu enfrentei problemas semelhantes no modo noturno. Algumas telas eram boas, mas outras mantinham o tema regular. No final, descobri que estava instanciando algumas visualizações usando o contexto do Aplicativo em vez do contexto de atividade atual. Por alguma razão, o contexto do aplicativo não rastreia esse tipo de informação.

Portanto, atualize seu código para usar o contexto de atividade atual em vez do contexto do aplicativo.

Para referência para outros usuários. Evitar:

ContextCompat.getColor(getApplicationContext(), R.id.myColor)

E use:

// In a Activity
ContextCompat.getColor(this, R.id.myColor)

// In a View
ContextCompat.getColor(getContext(), R.id.myColor)

// In a Fragment (check against null because getColor can trigger a NPE
Context context = getContext()
if (context != null) {
    ContextCompat.getColor(context, R.id.myColor)
}
W0rmH0le
fonte
3
Applicationé um contexto "bruto", ele sempre fará referência a valores do estilo padrão e desconsiderará qualquer configuração. AppCompatActivitypor outro lado, lida com configurações adequadas e está vinculado AppCompatDelegate.
Pawel
@Pawel muito boa adição a esta resposta, obrigado!
muetzenflo 24/03