动态更改所有工具栏图标颜色

Changing all toolbar icon colors dynamically

我实现了以下功能来更改操作栏中所有项目的颜色。在展开或折叠 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);] 是 运行正确。

当 activity 进入后台并再次恢复时,问题解决。例如按主页按钮并使用最近的应用程序列表返回 activity 或从 activity 打开新的 activity 并返回。

我将 for 循环中的代码更改为下面的代码,但没有成功(我正在使用 IconicDrawables 作为菜单图标)

IconicsDrawable icon = (IconicsDrawable) toolbar.getMenu().getItem(i).getIcon();
if (icon !=null) {
    icon.color(color);
}

将可绘制图标从 IconicDrawable 替换为可绘制文件夹内的 PNG 可绘制对象也没有解决问题。

尝试像这样更改图标的颜色,使用 drawable mutation:-

if (icon !=null) {
       icon.mutate();
       icon.setColorFilter(colorFilter);
    }

经过一番搜索,我通过添加以下代码解决了问题:

@Override
public boolean onMenuOpened(int featureId, Menu menu) {
    invalidateOptionsMenu();
    return super.onMenuOpened(featureId, menu);
}

它只是在打开溢出菜单后重新绘制图标。但是我还不知道上述问题的原因。