TL, DR;

ContextCompat.getColor() не использует ночные цвета (values-night/colors.xml), хотя должен, когда включен ночной режим.

Вот в чем проблема:

Привет всем,

Итак, я реализую темную тему для своего Android-приложения, я вызываю это, чтобы включить ее: AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);

Я установил цвета в values/colors.xml и темную версию в values-night/colors.xml. Цвета хорошо меняются в зависимости от nightMode, НО:

Когда я использую ContextCompat.getColor(getApplicationContext(), R.id.myColor), используются обычные цвета (values/colors.xml), а не ночные цвета (values-night/colors.xml).

В моем build.gradle я установил следующее:

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

Может ли кто-нибудь сказать мне, что я делаю не так?

PS: я уже рассматривал следующий вопрос, и он не отвечает на эту проблему https : //stackoverflow.com/questions/57779661/contextcompat-getcolor-method-ignores-night-mode

15
Mathieu de Brito 10 Окт 2019 в 15:45

1 ответ

Лучший ответ

Я столкнулся с аналогичными проблемами с ночным режимом. Некоторые экраны были в порядке, но другие сохранили обычную тему. В конце концов, я обнаружил, что создавал экземпляры некоторых представлений, используя контекст приложения вместо текущего контекста активности. По какой-то причине контекст приложения не отслеживает такую ​​информацию.

Итак, обновите свой код, чтобы использовать контекст текущей активности вместо контекста приложения.

Для справки для других пользователей. Избегать:

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

И используйте:

// 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 getContext can trigger a NPE
Context context = getContext()
if (context != null) {
    ContextCompat.getColor(context, R.id.myColor)
}
21
W0rmH0le 13 Ноя 2020 в 22:39