ContextCompat.getColor () игнорировать NightMode

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


person Mathieu de Brito    schedule 10.10.2019    source источник
comment
Я не могу воспроизвести это, я использую appcompat 1.1.0, и оба цвета из XML и ContextCompat.getColor() возвращают допустимые значения после включения ночного режима. Можете ли вы уточнить свой вопрос с помощью фрагмента кода (когда вы меняете ночной режим / получаете цвет)?   -  person Pawel    schedule 10.10.2019
comment
Вероятно, вы передаете недопустимый контекст (например, ApplicationContext) в getColor. Не могли бы вы рассказать, как вы вызываете getColor?   -  person W0rmH0le    schedule 10.10.2019
comment
@ W0rmH0le да, я передавал ApplicationContext, я не знал, что мне нужно использовать действие, чтобы это работало! Не могли бы вы дать это как официальный ответ, чтобы я мог отметить ваш ответ как действительный?   -  person Mathieu de Brito    schedule 10.10.2019
comment
@Pawel Спасибо за отзыв, он помог мне узнать, что это ошибка в моем коде :)   -  person Mathieu de Brito    schedule 10.10.2019
comment
Рад, что смог помочь! Я столкнулся с похожими проблемами ... В конце концов, я использовал контекст приложения, как вы   -  person W0rmH0le    schedule 10.10.2019


Ответы (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)
}
person W0rmH0le    schedule 10.10.2019
comment
Application - это необработанный контекст, он всегда будет ссылаться на значения из стиля по умолчанию и игнорировать любую конфигурацию. AppCompatActivity, с другой стороны, обрабатывает правильные конфигурации и связан с AppCompatDelegate. - person Pawel; 10.10.2019