Значки со стрелкой вверх и переполнением Неправильный цвет в устройствах с предварительным лепестком после обновления до библиотеки поддержки 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
Ответы
Ответ 1
Я мог бы исправить.
Я обнаружил, что тема 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 (ССЫЛКА ЗДЕСЬ), мы должны обновить 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>
Надеюсь, это поможет вам.
Вот как я исправил свою проблему.
Ответ 2
Просто обновите библиотеку поддержки 23.2.1, которая устраняет проблему.
Для пользователей AppCompat флаги для включения векторных ссылок для поддержки, описанные в сообщении блога 23.2 (http://goo.gl/073Mpo), больше не требуются для использования AppCompat.
https://plus.google.com/+AndroidDevelopers/posts/BZgzpAqkd8G
Ответ 3
У меня возникла эта проблема при изменении библиотеки поддержки до 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);
}
Ответ 4
Я пишу этот ответ, потому что принятый ответ не работал у меня (хотя это и правильно). Но я решил это по-другому, поэтому я делюсь этим здесь:
Прежде всего, я ничего не добавил в файл gradle. Я использую Support Library v23.4.0, так как он является последним на момент написания этого сообщения.
Что для меня работало, это hardcode цвет оттенка или цвет пути, а не использование ссылки ресурса цвета. Например, используйте 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. Поэтому я изменил это на твердое значение. Опять же это простой метод обхода/взлома и, вероятно, не правильное решение.
Ответ 5
Я написал помощника (я использую класс static 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);