Drawable ColorFilter сохраняется через переходы активности для одного и того же ресурса

У меня есть Activity с некоторыми пунктами меню, для которых я меняю цвета значков следующим образом:

private void colorMenuItem(MenuItem item) {
  if (item != null) {
    Drawable icon = item.getIcon();
    if (icon != null) {
      icon.setColorFilter(getResources().getColor(R.color.some_color), PorterDuff.Mode.SRC_ATOP);
    }
  }
}

Значки представляют собой белые файлы PNG из набора значков материалов. Это работает, как и ожидалось, и элементы меню окрашены по желанию.

Однако, когда я запускаю другое действие, которое использует тот же ресурс рисования, который уже был окрашен, но в другом представлении (например, FAB вместо меню), ColorFilter для этого представления остается. Почему это?

Разве FAB не должен снова загружать файл ресурсов и не должен ли он быть белым (или неизмененным)?


person peshkira    schedule 12.04.2016    source источник


Ответы (2)


However, when I start another activity which makes use of the same drawable resource which was already colored, but in another view (e.g a FAB instead of the menu), the ColorFilter for this view remains. Why is that?

Это связано с тем, что рисуемое или растровое изображение было кэшировано, и поэтому следующий вызов того же идентификатора рисования будет тем же самым рисунком, который уже был окрашен ранее.

Чтобы исправить это, нужно сначала изменить рисуемый объект, прежде чем использовать его, чтобы иметь другой экземпляр, чтобы предотвратить его кеширование.

Drawable icon = item.getIcon().mutate(); //mutate it to prevent caching

person Rod_Algonquin    schedule 12.04.2016
comment
Я думал, что это так, но мутация, похоже, не исправит это. Я даже пытался снова установить его в пункт меню после его изменения, но все равно не повезло. - person peshkira; 15.04.2016
comment
@peshkira опубликуйте свой текущий подход - person Rod_Algonquin; 15.04.2016
comment
1) Раздуваю меню. 2) Я получаю пункт меню. 3) Я раскрашиваю пункт меню, как указано выше + ваше предложение по изменению. 4) Пункт меню окрашен как положено. 5) Я перехожу к другому действию, имеющему потрясающий ресурс с тем же ресурсом, что и значок src. 6) значок src фаба тоже окрашен вместо обычного цвета. позже постараюсь выложить скрины - person peshkira; 15.04.2016
comment
Я обнаружил, что это работает, за исключением одного устройства, которое у меня есть. Это должно быть какая-то внутренняя ошибка. Спасибо! - person peshkira; 26.08.2016

У меня была такая же проблема раньше, поскольку я помню, что фильтр применяется к каждому ресурсу изображения, на который ссылается. Вы можете использовать

icon.setColorFilter(null)

Чтобы сбросить цветной фильтр на ресурсе при следующем использовании. Таким образом, любой фильтр был применен до того, как это изображение будет удалено.

person Emin Ayar    schedule 12.04.2016