使用appcompat-v7自定义Actionmode中“返回”箭头的颜色

19

我的主题基于Theme.AppCompat.Light,如下所示:

<style name="core" parent="Theme.AppCompat.Light" >
    <!-- Material, Yo!-->
    <item name="colorPrimary">@color/theme_main_color</item>
    <item name="colorPrimaryDark">@color/deep_purple</item>
    <item name="colorAccent">@color/theme_accent_color</item>
    <item name="android:navigationBarColor" tools:ignore="NewApi">?attr/colorPrimary</item>
    <!-- Toolbar -->
    <item name="theme">@style/my_toolbar_theme</item>
    <item name="drawerArrowStyle">@style/my_drawer_arrow</item>
    <!-- Actionbar -->
    <item name="android:actionBarDivider">@null</item>
    <item name="android:actionBarTabStyle">@null</item>
    <item name="android:actionBarTabBarStyle">@null</item>
    <!-- Contextual Actionbar -->
    <item name="windowActionModeOverlay">true</item>
    <item name="actionModeBackground">?attr/colorAccent</item>
    <item name="actionModeStyle">@style/my_actionmode_style</item>
</style>

<style name="my_drawer_arrow" parent="Widget.AppCompat.DrawerArrowToggle" >
    <item name="spinBars">true</item>
    <item name="color">@color/theme_accent_color</item>
</style>

<style name="my_toolbar_style">
    <item name="android:id">@id/toolbar</item>
    <item name="android:minHeight">?attr/actionBarSize</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:background">?attr/colorPrimary</item>
    <item name="android:elevation" tools:ignore="NewApi">5dp</item>
</style>

<style name="my_actionmode_style" parent="Widget.AppCompat.Light.ActionMode.Inverse" >
    <item name="titleTextStyle">@style/my_actionmode_title_style</item>
    <item name="subtitleTextStyle">@style/my_actionmode_subtitle_style</item>
</style>

<style name="my_toolbar_style.gradient">
    <item name="android:background">@drawable/ab_gradient_bg</item>
</style>

<style name="my_toolbar_theme" parent="ThemeOverlay.AppCompat.Dark.ActionBar" >
    <!-- Customize the toolbar here -->
</style>

<style name="my_actionmode_title_style" parent="TextAppearance.AppCompat.Widget.ActionMode.Title">
    <item name="android:textColor">@color/std_white</item>
</style>

<style name="my_actionmode_subtitle_style" parent="TextAppearance.AppCompat.Widget.ActionMode.Subtitle">
    <item name="android:textColor">@android:color/white</item>
</style>

actionmode中,我想看到白色的标题/副标题以及白色的返回箭头。我已经成功将标题和副标题的文本颜色设置为白色,但是返回箭头仍然是黑色的。这个问题只发生在我使用SupportActionBar而不是Toolbar的地方(Toolbar中的返回箭头是白色的)。

这是我在ActionMode下的Toolbar。

这是我在ActionMode下的Toolbar

这是ActionMode下的ActionBar。同一手机、同一个应用程序、相同的主题,只是不同的活动。

这是ActionMode下的ActionBar

我无法找到任何可以确定这种颜色的主题。根据源码,该图标是@drawable/abc_ic_ab_back_mtrl_am_alpha,是白色的,所以肯定有某些东西在对其进行着色。这个黑色的颜色来自哪里?


试试这个:https://dev59.com/pF4c5IYBdhLWcg3weqa9 - Quanturium
4个回答

50

使用AppCompat进行自定义:

在您的应用程序级主题中:

<style name="MyTheme" parent="Theme.AppCompat.Light">
    <item name="actionModeCloseButtonStyle">@style/myclosebutton</item>
</style>
在 CloseButtonStyle 中:
<style name="myclosebutton" parent="Widget.AppCompat.Light.ActionButton.CloseMode">
    <item name="android:tint">#ff0</item> <!-- whatever color -->
</style> 

这应该被标记为正确答案。它允许在操作模式下更改返回箭头的颜色,而无需知道正在使用的可绘制对象是什么。谢谢。 - Rui
谢谢伙计,终于找到了可行的东西...! - Diego Palomar
1
最佳答案 - Hadi

10

我曾经遇到过同样的问题,后来通过在样式中显式声明要使用的图标来解决了它:

<item name="android:actionModeCloseDrawable">@drawable/ab_back</item>

其中 @drawable/ab_back 是由我提供的。

这并不理想,因为我希望可以正确设置样式,并且让它从父主题继承正确的颜色,而不需要声明如此特定的细节。但是,我觉得围绕 ActionBar、SupportActionBar、SherlockActionBar、ActionBarActivity、FragmentActivityWithASherlockSupportActionToolbar 的所有内容都太糟糕和糟糕了,以至于我很高兴用一种变通方法解决它。


6
是的,我不想这样做。支持库中存在相当多的差异。足以让史蒂夫·乔布斯在听到有人说“碎片化”时在墓里笑出声来... - copolii

0

尝试在“NoActionBar Theme”中使用如下所示的“colorControlNormal”属性

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="colorControlNormal">@android:color/white</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

-1

我有这个问题的最佳答案

 Spannable text = new SpannableString( mode.getTitle());
                    text.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.colorPrimaryDark)),
                            0, text.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
                    mode.setTitle(text);

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