更新到支持库 23.2.0 后,前棒棒糖设备中的后退箭头和溢出图标颜色错误

Back Arrow and Overflow Icons Wrong Color in Pre-Lollipop Devices After Updating to Support Library 23.2.0

在 Lollipop 之前的设备上,升级到 Support Library 23.2.0 后,操作栏上的溢出菜单图标和后退按钮变为黑色。它们在升级前是白色的(这是正确的颜色)。

正确的颜色是:

升级后 Lollipop 之前的设备出现错误的颜色,如溢出菜单图标所示:

sytle.xml中的主题(pre-v21/Lollipop):

<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>

我已经查看 and 但没有解决问题。

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

我可以解决。

我发现 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
  • 其二:是用vector

如何修复

根据库 V23.2.0 发行说明 (LINK HERE),我们必须更新 build.gradle 以添加对 Vector 的支持:

build.gradle

将以下行添加到您的构建中 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>

希望对您有所帮助。

这就是我解决问题的方法。

我在将支持库更改为 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);
}

只需更新到支持库 23.2.1,即可解决问题。

For AppCompat users, the flags for enabling support vector drawables described in the 23.2 blog post (http://goo.gl/073Mpo) are no longer required for usage of AppCompat.

https://plus.google.com/+AndroidDevelopers/posts/BZgzpAqkd8G

我写了一个helper(我用的是一个static Helper class,有很多有用的功能)函数,可以在activity的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);
        }
    }    

在activity的onCreate()中这样调用:

Helper.setWhiteBackArrow(getSupportActionBar(), this);

我正在写这个答案,因为接受的答案对我不起作用(即使它是正确的)。但是我用另一种方式解决了,所以在这里分享一下:

首先,我没有在 gradle 文件中添加任何内容。我正在使用支持库 v23.4.0,因为它是撰写本文时的最新版本 post。

对我有用的是硬编码色调颜色或路径颜色,而不是使用颜色资源参考。例如,使用 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 以下不起作用。所以我将其更改为硬编码值。同样,这是一个简单的 workaround/hack,可能不是正确的解决方案。