更新到支持库 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,可能不是正确的解决方案。
在 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>
我已经查看
更新: 另请参阅此 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,可能不是正确的解决方案。