我有一些带有一些菜单项的活动,我为此更改了图标颜色:
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是否应该再次加载资源文件而不应该是白色(或不变)?
答案 0 :(得分: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或bitmap已经缓存,因此下一次调用相同的drawable id将是之前已经着色的drawable。
要修复它,首先要改变drawable,然后再使用它来生成另一个实例,以防止它被缓存。
Drawable icon = item.getIcon().mutate(); //mutate it to prevent caching
答案 1 :(得分:0)
之前我遇到过同样的问题,因为我记得每个引用的图像资源都应用了过滤器。你可以使用
icon.setColorFilter(null)
在下次使用时重置资源上的滤镜。通过这种方式,在删除此图像之前应用了任何过滤器。