如何设置 MenuItem 的图标颜色?

Posted

技术标签:

【中文标题】如何设置 MenuItem 的图标颜色?【英文标题】:How to set icon color of MenuItem? 【发布时间】:2015-11-04 08:54:33 【问题描述】:

我定义了一个具有 ShareActionProvider 和共享白色图标的菜单项,如下所示:

<item
    android:icon="@drawable/ic_share_white_24dp"
    android:id="@+id/action_share"
    android:title="@string/action_share"
    android:orderInCategory="200"
    app:showAsAction="ifRoom"
    app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

但是当我启动应用程序时,我得到一个不同的黑色共享图标。如何将分享图标设置为白色?

这是我得到的结果

【问题讨论】:

【参考方案1】:

图标实际上是由ShareActionProvider 提供的,您无法更改它。但是,您可以通过在您的styles.xml 中设置textColorPrimary 来自定义颜色:

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_
    android:layout_
    app:theme="@style/MyActionBarTheme"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light">

<style name="MyActionBarTheme" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
    <item name="android:textColorPrimary">#fa0</item>
</style>

对于任何自定义图标,您必须自己为它们着色,即。

@Override
public boolean onCreateOptionsMenu(Menu menu) 
    getMenuInflater().inflate(R.menu.menu_main, menu);

    for(int i = 0; i < menu.size(); i++)
        Drawable drawable = menu.getItem(i).getIcon();
        if(drawable != null) 
            drawable.mutate();
            drawable.setColorFilter(getResources().getColor(R.color.textColorPrimary), PorterDuff.Mode.SRC_ATOP);
        
    

    return true;

【讨论】:

@YoannHercouet 您是否尝试更改其他图标的颜色,而不是 ShareActionProvider 图标,因为这个问题是专门要求的?你在用Toolbar吗? 该问题指定了 MenuItems,但无论如何我尝试使用 ShareActionProvider。我意识到这个图标是自动设置的,所以你不需要设置一个,你只需要像 BladeCoder 解释的那样改变主题,它就会自动显示为白色。我试着按照你说的设置textColorPrimary,它不会改变任何东西,即使它会改变,它不仅会改变ActionBar或ToolBar,还会改变应用程序中的所有标题和许多组件。 @YoannHercouet 好吧,有些事情可能已经改变了,但是 ShareActionProvider 和溢出菜单仍然受到textColorPrimary 的影响,如果工具栏的样式是为它设计的。对于任何自定义图标,您必须自己为它们着色。【参考方案2】:

简短而甜蜜的答案--> app:iconTint="@color/yourcolor

在您的MenuItem 中添加app:iconTint="@color/yourcolor" 以更改图标颜色。

<item
    android:icon="@drawable/ic_share_white_24dp"
    android:id="@+id/action_share"
    android:title="@string/action_share"
    android:orderInCategory="200"
    app:iconTint="@color/yourcolor"
    app:showAsAction="ifRoom"
    app:actionProviderClass="android.support.v7.widget.ShareActionProvider"/>

【讨论】:

如果您想从 menu-XML 重新着色,这不是一个糟糕的解决方案:命名空间应该是 android: 而不是 app:我>android:iconTint="@android:color/white"。重要提示:属性 iconTint 仅用于 API 级别 26 及更高级别! @danny.schimke 使用 app: insted of android: 然后它将在 26 api 以下使用 你是对的,使用 app:iconTitle 它甚至可以在 API 26 以下工作 - 谢谢!也许人们会感到困惑,因为在我的 IDE 中它没有在预览中正确显示,但在运行时正确重新着色!您的解决方案效果很好,不值得投反对票! 注意,我使用的是系统图标,甚至使用iconTint 作为“#FFFFFF”,它仍然像灰色。我最终创建了一个新的矢量资源来正确获得一个全白的图标。【参考方案3】:

这是一个主题问题。根据您当前的主题,您需要设置正确的 ActionBar 覆盖主题。 Action Provider 读取主题中的一个值(指示主题是深色还是浅色)来确定图标的颜色。

如果您的主主题是浅色而您的 ActionBar 是深色,则您的 ActionBar/Toolbar 必须使用主题 ThemeOverlay.AppCompat.Dark.ActionBar

【讨论】:

我是主题Theme.AppCompat.Light.NoActionBar,如何实现? 确实,您的主题很轻,而且您正在使用工具栏。您需要在 XML 布局中将 android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 指定为 Toolbar 的属性。如果希望工具栏弹出菜单亮而工具栏暗,还需要添加app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 如果我设置主题android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar,他会不会改变我工具栏的颜色? 不,Toolbar的颜色是由android:background的值决定的。该主题允许使用正确的默认外观膨胀工具栏中的视图。 这只会改变溢出图标,不会改变菜单项颜色【参考方案4】:

试试这个:

public boolean onCreateOptionsMenu(Menu menu) 

    getMenuInflater().inflate(R.menu.MENU, menu);

    // change color for icon 0 
    Drawable yourdrawable = menu.getItem(0).getIcon(); // change 0 with 1,2 ... 
    yourdrawable.mutate();
    yourdrawable.setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.SRC_IN);
    return true;
       

【讨论】:

【参考方案5】:

简短回答 --> 使用app:iconTint="?android:textColorPrimary" 如果您希望图标颜色为白色,请编写: android:theme = "@style/ThemeOverlay.MaterialComponents.Dark.ActionBar" 否则,如果您想要黑色,请写: android:theme="@style/ThemeOverlay.MaterialComponents.Light" 到你的工具栏

【讨论】:

嗨,欢迎来到 ***。由于这个问题已经有几个流行的答案,包括一个被接受的答案,请编辑你的答案以描述这个略有不同的解决方案的行为以及为什么你觉得它有帮助。谢谢。【参考方案6】:

菜单中图标的颜色可以在 Layout/activity_main.xml 中改变

在这个标签 com.google.android.material.navigation.NavigationView 中设置这一行 app:itemIconTint="@color/red_warning

    <?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/drawer_layout"
        android:layout_
        android:layout_
        android:fitsSystemWindows="true"
        tools:openDrawer="start">

    <include
            layout="@layout/app_bar_main"
            android:layout_
            android:layout_/>


    <com.google.android.material.navigation.NavigationView
            android:id="@+id/nav_view"
            android:layout_
            android:layout_
            android:layout_gravity="start"
            android:fitsSystemWindows="true"
            app:headerLayout="@layout/nav_header_main"
            app:menu="@menu/activity_main_drawer"
            app:itemIconTint="@color/red_warning"
    />


</androidx.drawerlayout.widget.DrawerLayout>

【讨论】:

【参考方案7】:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) 
    menuInflater.inflate(R.menu.menu_confirm, menu);
    MenuItem action_done = menu.findItem(R.id.action_done);
    action_done.setIcon(R.drawable.ic_filter);
    Utils.menuIconColor(action_done, Color.WHITE);
    super.onCreateOptionsMenu(menu, menuInflater);


public static void menuIconColor(MenuItem menuItem, int color) 
    Drawable drawable = menuItem.getIcon();
    if (drawable != null) 
        drawable.mutate();
        drawable.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
    

【讨论】:

【参考方案8】:
 app:iconTint="@color/colorWhite" 

在导航视图属性中添加它

前-

<com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_
        android:layout_
        android:layout_gravity="start"
        android:background="@color/main_color"
        app:itemBackground="@drawable/divider_menu_items"
        app:itemTextColor="@color/colorWhite"
        app:itemIconTint="@color/colorWhite"
        app:menu="@menu/activity_main_drawer"/>

添加此所有菜单项图标将转换为您指定的颜色。

【讨论】:

【参考方案9】:

这种行为是意料之中的,因为ShareActionProvider

负责创建支持数据共享的视图,并负责 如果放置了托管项目,则显示包含共享活动的子菜单 在溢出菜单上。

根据to the documentation.

这意味着您在使用视图时无法控制视图的自定义。

【讨论】:

以上是关于如何设置 MenuItem 的图标颜色?的主要内容,如果未能解决你的问题,请参考以下文章

WPF:设置MenuItem多种不同状态图标

从URL设置MenuItem图标 - Android

如何覆盖 Material-UI MenuItem 选择的背景颜色?

如何在 Material UI 中更改 Select 的文本、图标和下划线颜色

如何通过 sharedpreferences 保存 menuitem 可见性状态?

更改 SearchView 上的工具栏颜色/样式单击