Подтвердить что ты не робот

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

4b9b3361

Ответ 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);