动态更改所有工具栏图标颜色
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);
}
它只是在打开溢出菜单后重新绘制图标。但是我还不知道上述问题的原因。
我实现了以下功能来更改操作栏中所有项目的颜色。在展开或折叠 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);
}
它只是在打开溢出菜单后重新绘制图标。但是我还不知道上述问题的原因。