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

时间:2018-08-21 15:03:57

标签: android android-actionbar android-toolbar

我实现了以下功能,以更改操作栏中所有项目的颜色。并在扩展或折叠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可绘制图标也无法解决问题。

Illustration of the problem

2 个答案:

答案 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);
}

打开溢出菜单后,它仅重绘图标。但是上述问题的原因我仍然不知道。