AppCompat工具栏:如何在ActionMode中更改溢出菜单图标的颜色?

40
使用AppCompat工具栏,我想要能够在ActionMode改变时改变溢出菜单图标的颜色。
例如,在常规工具栏模式下,溢出图标将是白色的。而在ActionMode下会变成黑色。到目前为止,我已经成功地更改了操作模式的背景以及标题文本。但我还没有找到改变溢出菜单图标颜色的方法。
我知道有一个答案: Change ActionMode Overflow icon 我尝试过第一个解决方案,但我找不到溢出图标。
即使延迟50L,第二个解决方案也会使溢出菜单图标在短暂的一瞬间闪烁ActionMode的预期颜色,这非常刺眼。
12个回答

73
将以下行添加到您的主题属性中:

在您的主题属性中添加以下行:

<item name="android:textColorSecondary">@android:color/white</item>

我不知道我还有第二个解决方案,请查看此链接https://dev59.com/j18d5IYBdhLWcg3wkS7Y#33938229。 - Piyush
6
请注意,这也会改变某些设备中按特殊键显示的底部菜单中的文本颜色。如果textColorSecondary和菜单背景设置为相同(或类似)的颜色,则可能会出现问题。 - Stan Mots
2
更好的方法是创建一个单独的样式: - Ariq
这不会导致操作模式和普通工具栏中的不同颜色。 - Sver
将文本颜色设置为硬编码的白色(或任何固定颜色)将无法反映其是否已激活或禁用等。您真正需要的是一个颜色选择器。 - johngray1965

17
这可以通过设置android:textColorSecondary主题属性来实现。
例如,假设您有以下使用主题MyToolbarStyle的工具栏:
<android.support.v7.widget.Toolbar
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:id="@+id/main_toolbar"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:minHeight="?attr/actionBarSize"
  theme="@style/MyToolbarStyle"
/>

接下来,定义样式MyToolbarStyle,继承自ThemeOverlay.AppCompat.ActionBar。最后,通过添加android:textColorSecondary的项目来修改溢出图标的颜色:

<style name="MyToolbarStyle" parent="ThemeOverlay.AppCompat.ActionBar">
  <item name="android:textColorSecondary">#ff00ff</item>
</style>

<style name="MyToolbarStyle" parent="ThemeOverlay.AppCompat.ActionBar">
  <item name="android:textColorSecondary">#333333</item>
</style>

4
你好。谢谢你回答……但问题是溢出图标菜单颜色被上下文菜单的溢出图标和工具栏的溢出图标共用了。目标是让它们两者有不同的颜色。 - thisbytes
现在,如果您在操作栏中禁用某些内容,它们仍将是白色。您需要选择一种颜色,而不是硬编码的颜色。 - johngray1965

12
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
     <item name="android:actionOverflowButtonStyle">@style/ActionButton.Overflow.Icon</item>
 </style>

 <style name="ActionButton.Overflow.Icon" parent="android:style/Widget.Holo.Light.ActionButton.Overflow">
     <item name="android:src">@mipmap/yourwanticon</item>
 </style>

唯一的答案完美地工作,不改变文本颜色或菜单项颜色 - 只有溢出菜单图标。 - Daniel

11
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="android:actionOverflowButtonStyle">@style/ActionButtonOverflow</item>

    <!-- Support library compatibility -->
    <item name="actionOverflowButtonStyle">@style/ActionButtonOverflow</item>
</style>

<style name="ActionButtonOverflow" parent="@style/Widget.AppCompat.ActionButton.Overflow">
    <item name="android:tint">@color/brand_white</item>
</style>

5
请在res->styles.xml文件中添加以下代码。
<style name="ToolbarColored" parent="AppTheme">
<item name="android:textColorSecondary">YOUR_COLOR</item>
</style>

那么您的XML文件中的'ToolbarColored'样式如下所示:
<android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        app:theme="@style/ToolbarColored"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

不改变 MaterialToolbar 图标颜色。 - user924

5
<style name="ToolBarTheme" parent="ThemeOverlay.AppCompat.ActionBar">
    <item name="android:tint">@color/colorAccent</item>

使用您的颜色创建上述主题。将着色添加到该主题,并将该主题添加到工具栏中。

<androidx.appcompat.widget.Toolbar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize"
        android:theme="@style/ToolBarTheme"/>

到目前为止最佳解决方案。 - Bukunmi

3
为了正确更改工具栏溢出菜单图标的颜色,请将工具栏主题设置为AppCompat深色ActionBar主题。例如:
在res/values/style.xml文件中创建一个继承自AppCompat的主题,如下所示:
<style name="AppTheme.MyThemeName" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

现在将您的工具栏主题设置为此主题:
<android.support.v7.widget.Toolbar
  android:id="+id/my_toolbar_id
  android:layout_width="match_parent"
  android:layout_height="@dimen/my_toolbar_height"
  android:theme="@style/AppTheme.MyThemeName">

</android.support.v7.widget.Toolbar>

3

这里没有任何答案能够帮助我独立地改变ActionMode的溢出图标颜色,而不用在代码中一个个地进行样式设置。经过一些尝试和错误,我认为我们可以独立于Toolbar覆盖ActionMode的theme属性,它起到了作用!

在基础主题中,我们像往常一样指定操作模式的样式:

<style name="BaseTheme" parent="Theme.MaterialComponents.DayNight.Bridge">
        <item name="actionModeStyle">@style/ActionModeStyle</item>
</style>

在我们自定义的ActionModeStyle中,我们可以做任何样式,并指定一个theme属性:
<style name="ActionModeStyle" parent="@style/Widget.AppCompat.ActionMode">
        <item name="theme">@style/ActionMode.Theme</item>
</style>

<style name="ActionMode.Theme" parent="ThemeOverlay.AppCompat.Dark">
        <item name="android:textColorSecondary">?attr/colorPrimary</item>
</style>

textColorSecondary 也会改变返回按钮的颜色,但我们可以使用 actionModeCloseButtonStyle 轻松地覆盖它。


不会改变 MaterialToolbar 图标的颜色。 - user924

2

如果您正在使用活动xml中的工具栏,您可以使用以下内容:

toolbar?.navigationIcon?.setColorFilter(ContextCompat.getColor(this, android.R.color.black), PorterDuff.Mode.SRC_ATOP)

谢谢。这对我很有帮助。如果菜单项包含actionLayout,该怎么做? - Thunder Dragon

2

首先制作您的自定义样式

 <style name="ToolbarColoredBackArrow" parent="AppTheme">
    <item name="android:textColorSecondary">@color/white</item>
 </style>

然后将其添加到您的工具栏中。
     <android.support.v7.widget.Toolbar
          android:id="@+id/toolbar"
          android:layout_width="match_parent"
          android:titleTextColor="@color/white"
          app:theme="@style/ToolbarColoredBackArrow"
          android:layout_height="?attr/actionBarSize"
          app:layout_scrollFlags="scroll|enterAlways"
          android:background="?attr/colorPrimary" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接