支持库23.2.0更新后,Pre-Lollipop设备上的返回箭头和溢出图标颜色不正确

29
在 Android 5.0 以下的设备上,升级到 Support Library 23.2.0 后,ActionBar 上的溢出菜单图标和返回按钮变成了黑色。在升级之前,它们是白色(正确的颜色)。
正确的颜色是:enter image description here 升级后,Android 5.0 以下的设备会出现错误的颜色,如溢出菜单图标所示: enter image description here style.xml(Android 5.0 以下版本/棒棒糖之前的版本)中的主题:
<resources xmlns:android="http://schemas.android.com/apk/res/android" >
    <!--Used on the application level by the manifest.-->
    <style name="app_theme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/app_primary_colour</item>
        <item name="colorPrimaryDark">@color/app_primary_dark_colour</item>
        <item name="colorAccent">@color/app_accent_colour</item>
        <item name="android:windowBackground">@color/app_background</item>
        <item name="searchViewStyle">@style/custom_search_view_style</item>
    </style>

    <!--Used by activities.-->
    <style name="app_theme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <!--TODO: What are these?-->
    <style name="app_theme.app_bar_overlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
    <style name="app_theme.popup_overlay" parent="ThemeOverlay.AppCompat.Light" /> ... ... </resources>
我已查看这里这里,但未解决问题。

更新:还请参阅此Google错误报告:https://code.google.com/p/android/issues/detail?id=201918


2
我也遇到了这个问题。它只在 preLL 中出现,在 v23.1.1 中运行良好。 - guipivoto
1
返回箭头突然变成黑色了 :'( - silentsudo
5个回答

37

我可以修复。

我发现AppCompat主题正在使用以下资源作为溢出按钮:abc_ic_menu_overflow_material.xml

这个资源的内容是:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24.0"
        android:viewportHeight="24.0"
        android:tint="?attr/colorControlNormal">
    ...
</vector>

然后,我连起了这些点:

  • 第一:它使用的是colorControlNormal
  • 第二:它使用矢量图

如何解决问题

根据库V23.2.0发布说明(链接在此处),我们需要更新 build.gradle 文件以添加对矢量图的支持:

build.gradle

请将以下行添加到您的 build gradle 文件中:

Gradle 2.0(我没有测试过):

android {  
    defaultConfig {  
        vectorDrawables.useSupportLibrary = true  
    }  
}  

Gradle 1.5(我正在使用它...它可以工作):

android {  
    defaultConfig {  
        generatedDensities = []  
    }  

    aaptOptions {  
        additionalParameters "--no-version-vectors"  
    }  
}  

修复你的主题

这一步骤可以忽略。有些基础主题已经将colorControlNormal设置为白色(例如AppCompat.Dark.ActionBar)。

然而,在我的情况下,所有按钮的颜色仍然是黑色的,我不得不在我的主题中添加colorControlNormal并使用白色覆盖它。

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorControlNormal">@color/white</item>
</styel>

我希望这能对你有所帮助。

以下是我解决问题的方法。


8
谢谢,这对我有用! 实际上,我只需要添加 Gradle 配置(我也在使用 1.5),甚至不需要添加 ColorControlNormal。 - henrykodev
1
不使用"colorControlNormal"工作 :) 谢谢 -> 升级 - Vasil Valchev

7

我使用的是23.2.1版本,但仍然存在问题。 - Bruce
虚惊一场,刚刚发现由Android Studio向导生成的build.gradle文件默认使用23.2.0版本..我会尝试这个版本的,谢谢! - Bruce

4

我在将支持库更改为23.2.0时遇到了这个问题。返回箭头和溢出图标变成了黑色。

protected void changeBackArrow() {
    final Drawable upArrow = ContextCompat.getDrawable(this, R.drawable.abc_ic_ab_back_material);
    upArrow.setColorFilter(ContextCompat.getColor(this, R.color.textColorPrimary), PorterDuff.Mode.SRC_ATOP);

    getSupportActionBar().setHomeAsUpIndicator(upArrow);
}

从支持版本23.1开始,工具栏现在具有getOverflowIcon()和setOverflowIcon()方法。

protected void changeOverflowMenu() {
    final Drawable overflowIcon = getToolbar().getOverflowIcon();
    overflowIcon.setColorFilter(ContextCompat.getColor(this, R.color.colorWhite), PorterDuff.Mode.SRC_ATOP);

    getToolbar().setOverflowIcon(overflowIcon);
}

3
我写这篇回答是因为被接受的答案对我没有用(尽管它是正确的)。但我用另一种方法解决了它,所以在此分享:
首先,我没有向gradle文件中添加任何内容。我使用的是Support Library v23.4.0,因为在撰写本文时它是最新的。
对我有用的是硬编码着色或路径颜色,而不是使用颜色资源引用。例如,使用android:fillColor="#fff"而不是android:fillColor="@android:color/white":
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:tint="#fff"
    android:viewportHeight="24"
    android:viewportWidth="24">
    <path
        android:fillColor="#fff"
        android:pathData="M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z" />
</vector>

观察上面的代码片段中的色调和路径颜色。之前我将颜色分配为"@color/someColor",但是它显示了一个警告,只能在v21及以上版本中使用,并且在v21以下实际上无法工作。所以我将其更改为硬编码值。再次强调,这是一个简单的解决方法/黑客,可能不是正确的解决方案。

0
我写了一个帮助函数(我使用一个静态的 Helper 类,其中包含有用的函数),可以在活动的 onCreate() 开始时调用它:
    public static void setWhiteBackArrow(ActionBar actionbar, Context context){
    //needed due to bug in Android compile version 23
    // https://code.google.com/p/android/issues/detail?id=201918
    if (actionbar != null) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            final Drawable upArrow = ContextCompat.getDrawable(context, android.support.v7.appcompat.R.drawable.abc_ic_ab_back_material);
            upArrow.setColorFilter(ContextCompat.getColor(context, R.color.white), PorterDuff.Mode.SRC_ATOP);
            //ActionBar aBar = context.getSupportActionBar();
            actionbar.setHomeAsUpIndicator(upArrow);
        }
    }    

在活动的onCreate()方法中这样调用它:
Helper.setWhiteBackArrow(getSupportActionBar(), this);

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