我实现了以下功能来更改操作栏中所有项目的颜色。当我扩展或折叠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);]正确运行。
当活动进入后台并再次恢复时,问题就解决了。例如按主页按钮并使用最近的应用程序列表返回活动或从该活动中打开新活动并返回。
我将for循环中的代码更改为下面的代码,但没有运气(我使用IconicDrawables作为菜单图标)
IconicsDrawable icon = (IconicsDrawable) toolbar.getMenu().getItem(i).getIcon();
if (icon !=null) {
icon.color(color);
}
将IconableDrawable中可绘制的图标替换为drawables文件夹中的PNG drawable也无法解决问题。
尝试使用drawable mutation更改图标的颜色: -
if (icon !=null) {
icon.mutate();
icon.setColorFilter(colorFilter);
}
经过一些搜索,我通过添加以下代码解决了这个问题:
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
invalidateOptionsMenu();
return super.onMenuOpened(featureId, menu);
}
它只是在打开溢出菜单后重绘图标。但上述问题的原因我还不得而知。