Метод 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 для темной темы.