Значки «Назад» и «Переполнение» Неправильный цвет в предустановленных устройствах после обновления до библиотеки поддержки 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> 

Я посмотрел здесь и здесь, но не решил проблему.

ОБНОВЛЕНИЕ: см. Также отчет об ошибке Google: https://code.google.com/p/android/issues/detail?id=201918

Solutions Collecting From Web of "Значки «Назад» и «Переполнение» Неправильный цвет в предустановленных устройствах после обновления до библиотеки поддержки 23.2.0"

Я мог это исправить.

Я обнаружил, что тема 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
  • Второй: он использует вектор

КАК ИСПРАВИТЬ

Согласно примечаниям к выпуску Library V23.2.0 Release ( LINK HERE ), мы должны обновить build.gradle, чтобы добавить поддержку Vector:

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> 

Я надеюсь это тебе поможет.

Так я исправил свою проблему.

Просто обновите библиотеку поддержки 23.2.1, которая устраняет проблему.

Для пользователей AppCompat для использования AppCompat больше не требуются флаги для включения вспомогательных векторных чертежей, описанных в блоге блога 23.2 ( http://goo.gl/073Mpo ).

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

У меня возникла проблема при изменении библиотеки поддержки до 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); } 

Я пишу этот ответ, потому что принятый ответ не сработал для меня (хотя это и верно). Но я решил это по-другому, поэтому я делюсь этим здесь:

Прежде всего, я ничего не добавлял к файлу 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" цвет как "@color/someColor" но он показывал предупреждение о том, что он будет работать только для v21 и выше, и он фактически не работает ниже v21. Поэтому я изменил это на твердое значение. Опять же, это простой метод обхода / взлома и, вероятно, не правильное решение.

Я написал помощника (я использую статический класс 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);