Android 着色菜单图标

Android 着色菜单图标,android,xml,menu,Android,Xml,Menu,我正在构建一个Android应用程序,我使用动作栏图标包中的图标在动作栏中使用。我通过菜单文件夹中的xml文件定义它们。 有没有办法“着色”这些图标,使它们都是相同的颜色? 到目前为止,我必须用一个图像编辑软件手动完成,但是如果我决定改变颜色,我必须重新进行 我知道ImageView有一个android:tint属性,但我还没有找到一种方法将其用于菜单图标 谢谢也许有更好的方法可以做到这一点,但有一个选择是在代码中重新绘制图标 假设您有一个“收藏夹”菜单项,并希望将其着色为灰色: MenuIte

我正在构建一个Android应用程序,我使用动作栏图标包中的图标在动作栏中使用。我通过
菜单
文件夹中的xml文件定义它们。 有没有办法“着色”这些图标,使它们都是相同的颜色? 到目前为止,我必须用一个图像编辑软件手动完成,但是如果我决定改变颜色,我必须重新进行

我知道
ImageView
有一个
android:tint
属性,但我还没有找到一种方法将其用于菜单图标


谢谢

也许有更好的方法可以做到这一点,但有一个选择是在代码中重新绘制图标

假设您有一个“收藏夹”菜单项,并希望将其着色为灰色:

MenuItem-favoriteItem=menu.findItem(R.id.action\u-favorite);
Drawable newIcon=(Drawable)favoriteItem.getIcon();
setColorFilter(Color.argb(255,200,200,200),PorterDuff.Mode.SRC_-IN);
favoriteItem.setIcon(新图标);
您还可以使用颜色资源,如

newIcon.mutate().setColorFilter(getResources().getColor(R.color.myCustomTint),PorterDuff.Mode.SRC_-IN);

现在,您可以使用
DrawableCompat
中的着色,而不是使用滤色器:

MenuItem-favoriteItem=menu.findItem(R.id.action\u-favorite);
Drawable favoriteIcon=DrawableCompat.wrap(favoriteItem.getIcon());
ColorStateList colorSelector=ResourcesCompat.getColorStateList(getResources(),R.color.tinted_选择器,getTheme());
DrawableCompat.setTintList(收藏夹图标、颜色选择器);
favoriteItem.setIcon(favoriteIcon);

如果图标的原始来源是光栅图像,则可以通过
对其进行包装

将此文件添加到drawable文件夹-settings_icon.xml中:

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_action_settings"
    android:tint="@color/colorRed"/>

然后使用此可绘制菜单项:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/new_game"
    android:icon="@drawable/settings_icon"
    android:title="@string/settings"
    app:showAsAction="always"/>
</menu>

为了提高性能,您可以在utils类中创建一个静态方法,并随时使用该方法

--------定义你的方法-----------------------------------

public static void tintMenuIcon(Context context, MenuItem item, @ColorRes int color) {  
    Drawable normalDrawable = item.getIcon();
    Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable);
    DrawableCompat.setTint(wrapDrawable, context.getResources().getColor(color));

    item.setIcon(wrapDrawable);
}
Override
public boolean onCreateOptionsMenu(Menu menu) {  
    getMenuInflater().inflate(R.menu.menu_main, menu);
    MenuItem menuItem = menu.findItem(R.id.action_delete);

    if (menuItem != null) {
        tintMenuIcon(MainActivity.this, menuItem, android.R.color.holo_purple);//HERE
    }

    return true;
}
---------------------如何使用它-------------------------------

public static void tintMenuIcon(Context context, MenuItem item, @ColorRes int color) {  
    Drawable normalDrawable = item.getIcon();
    Drawable wrapDrawable = DrawableCompat.wrap(normalDrawable);
    DrawableCompat.setTint(wrapDrawable, context.getResources().getColor(color));

    item.setIcon(wrapDrawable);
}
Override
public boolean onCreateOptionsMenu(Menu menu) {  
    getMenuInflater().inflate(R.menu.menu_main, menu);
    MenuItem menuItem = menu.findItem(R.id.action_delete);

    if (menuItem != null) {
        tintMenuIcon(MainActivity.this, menuItem, android.R.color.holo_purple);//HERE
    }

    return true;
}

我的来源是:

例如,是否可以为
xml标记创建一个属性,例如
iconTint
属性,并以编程方式在相应的绘图表上应用setColorFilter?很难相信不可能用一个方法调用/样式属性为所有工具栏图标着色。必须迭代每个图标不是很好。合理的解决方案。这是静态菜单项的干净解决方案。