ContextCompat.getColor () игнорировать NightMode - PullRequest
4 голосов
/ 10 октября 2019

TL, DR;

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

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

Привет всем,

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

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

, когда я использую 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

1 Ответ

3 голосов
/ 10 октября 2019

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

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

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

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 getColor can trigger a NPE
Context context = getContext()
if (context != null) {
    ContextCompat.getColor(context, R.id.myColor)
}
...