我实现了以下功能,以更改操作栏中所有项目的颜色。并在扩展或折叠CollapsingToolbarLayout时使用它平滑更改元素的颜色。
private void setToolbarElementsColor(int color) {
PorterDuffColorFilter colorFilter
= new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP);
toolbar.getNavigationIcon().setColorFilter(colorFilter);
//overflowDrawable is IconicDrawable from com.mikepenz.iconics
if (toolbar.getOverflowIcon() != overflowDrawable){
toolbar.setOverflowIcon(overflowDrawable);
}
overflowDrawable.color(color);
toolbar.setTitleTextColor(color);
for (int i = 0; i< toolbar.getMenu().size(); i++){
Drawable icon = toolbar.getMenu().getItem(i).getIcon();
if (icon !=null) {
// HERE IS THE CODE WITH EXPLAINED PROBLEM
icon.setColorFilter(colorFilter);
}
}
}
这是菜单项的代码:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_back"
android:title="@string/add_remove_filter"
app:showAsAction="always" />
<item
android:id="@+id/action_filter"
android:title="@string/add_filter"
app:showAsAction="always" />
<item
android:id="@+id/action_save_report"
app:showAsAction="never"
android:title="@string/action_save_report">
</item>
</menu>
代码工作正常。但是一个奇怪的问题:当我一次打开溢出菜单并关闭它时,菜单图标会保留打开溢出菜单之前的最后一种颜色,并且不会根据其他工具栏元素(新颜色)进行更改我为所有元素设置)。
示例:对于带有浅色工具栏的展开状态,元素为黑色;对于带有深色工具栏的折叠状态,元素为白色。现在,如果我折叠工具栏并打开溢出菜单并关闭它,此后图标颜色保持白色,无论工具栏处于展开或折叠状态,甚至认为[icon.setColorFilter(colorFilter);]块都已正确运行。 / p>
当活动转到后台并再次恢复时,问题解决。例如按主页按钮,然后使用最近的应用列表返回活动,或者从该活动中打开新活动并返回。
我将for循环中的代码更改为下面的代码,但是没有运气(我将IconicDrawables用于菜单图标)
IconicsDrawable icon = (IconicsDrawable) toolbar.getMenu().getItem(i).getIcon();
if (icon !=null) {
icon.color(color);
}
将可绘制图标从IconicDrawable替换为可绘制文件夹中的PNG可绘制图标也无法解决问题。
答案 0 :(得分:0)
尝试使用drawable mutation来更改图标的颜色:-
if (icon !=null) {
icon.mutate();
icon.setColorFilter(colorFilter);
}
答案 1 :(得分:0)
经过一番搜索,我通过添加以下代码解决了该问题:
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
invalidateOptionsMenu();
return super.onMenuOpened(featureId, menu);
}
打开溢出菜单后,它仅重绘图标。但是上述问题的原因我仍然不知道。