Метод ContextCompat.getColor игнорирует ночной режим

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

Любопытно, что если я вызываю ContextCompat.getColor из Activity, он возвращает мне правильный цвет

//get Actual Theme Colors
String bgColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(this, R.color.dialogBackground)));
String txtColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(this, R.color.dialogText)));

Вместо этого, если я вызываю ContextCompat.getColor из фрагмента внутри действия, он возвращает неправильный цвет

//get Actual Theme Colors
bgColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(getActivity(),R.color.dialogBackground)));
txtColor = String.format("#%06X", (0xFFFFFF & ContextCompat.getColor(getActivity(),R.color.dialogText)));

Я использую androidx.appcompat:appcompat:1.0.2 lib

Я не знаю, связано ли это с этой ошибкой

Надеюсь, вы найдете решение или, по крайней мере, обходной путь, например getColor из ресурса для конкретной конфигурации (если возможно).

1 ответ

Решение

Проблема решена, но я здесь, чтобы помочь другим решить те же проблемы.

Странное поведение было вызвано веб-просмотром. Как указано в этой ссылке, когда вы впервые открываете Webview, а затем заменяете фрагмент или добавляете новые представления в пользовательский интерфейс, они будут использовать неправильные цвета без соблюдения ночной темы. Та же проблема, если вы получаете цвет программно. Я пробовал обходные пути, такие как воссоздание Activity или недействительность кеша ресурсов, и они действительно решили проблему, но они действительно плохи с точки зрения производительности.

Обновление до androidx.appcompat:appcompat:1.1.0-rc01 устраняет проблему, по крайней мере частично. Если у вас есть несколько представлений без определенного цвета, либо в теме приложения, либо в макете xml, они все равно будут давать сбой и использовать неправильные цвета при первом запуске веб-просмотра, а затем изменить фрагмент. Итак, вы должны определить каждый цвет ваших представлений в теме приложения, используя вариант ресурса (-ночь) для ночных цветов. Если вы это сделаете, просмотры будут следовать вашей теме и использовать правильные цвета.

TL;DR

  • Обновитесь до androidx.appcompat:appcompat 1.1.0-rc01 или последней версии

  • Проверьте, остались ли у вас проблемы

  • Если да, то установите цвета для каждого представления, для которого вы не определили цвет в теме или xml, используя вариант -night для темной темы.

Другие вопросы по тегам