web-dev-qa-db-fra.com

Icônes de flèche arrière et de débordement Couleur incorrecte dans les périphériques Pre-Lollipop après la mise à jour dans la bibliothèque de support 23.2.0

Sur les appareils antérieurs à Lollipop, l’icône du menu de dépassement et le bouton précédent de la barre d’action sont passés à la couleur noire après la mise à niveau vers Support Library 23.2.0. Ils sont blancs (qui est la bonne couleur) avant la mise à niveau.

La couleur correcte est:  enter image description here

La couleur incorrecte apparaît pour les périphériques pré-Lollipop après la mise à niveau, comme indiqué par l'icône de menu de débordement:

 enter image description here

Le thème dans sytle.xml (pré-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>

J'ai regardé ici et ici mais je n'ai pas résolu le problème.

UPDATE: Voir également ce rapport de bogue Google: https://code.google.com/p/Android/issues/detail?id=201918

27
henry000

Je pourrais réparer.

J'ai trouvé que le thème AppCompat utilise la ressource suivante pour le bouton de débordement: abc_ic_menu_overflow_material.xml

Le contenu de cette ressource est:

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

Ensuite, j'ai connecté les points:

  • Premièrement: il utilise colorControlNormal
  • Deuxièmement: il utilise un vecteur

COMMENT RÉPARER

Selon les notes de publication de Library V23.2.0 ( LINK HERE ), nous devons mettre à jour build.gradle pour ajouter la prise en charge à Vector:

build.gradle

Ajouter les lignes suivantes à votre niveau de construction

Gradle 2.0 (je n'ai pas testé):

Android {  
    defaultConfig {  
        vectorDrawables.useSupportLibrary = true  
    }  
}  

Gradle 1.5 (je l'utilise .. ça marche):

Android {  
    defaultConfig {  
        generatedDensities = []  
    }  

    aaptOptions {  
        additionalParameters "--no-version-vectors"  
    }  
}  

Correction de votre thème

Cette étape peut être ignorée. Certains thèmes de base ont déjà défini colorControlNormal en blanc (tel que AppCompat.Dark.ActionBar).

Cependant, dans mon cas, toutes les couleurs des boutons restaient noires et je devais ajouter la variable colorControlNormal à mon thème et le remplacer par une couleur blanche.

<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorControlNormal">@color/white</item>
</styel>

J'espère que cela pourra vous aider.

C'est ainsi que j'ai résolu mon problème.

35
W0rmH0le

Il suffit de mettre à jour la bibliothèque de support 23.2.1, qui résout le problème.

Pour les utilisateurs d'AppCompat, les indicateurs d'activation des dessins de vecteur de support décrits dans l'article de blog 23.2 ( http://goo.gl/073Mpo ) ne sont plus nécessaires pour utiliser AppCompat.

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

7
Jorge Pastor

J'ai eu ce problème en changeant la bibliothèque de support à 23.2.0. Les icônes flèche arrière et débordement sont devenues noires.

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);
}

Depuis le support 23.1 Toolbar a maintenant les méthodes getOverflowIcon () et 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

J'écris cette réponse, parce que la réponse acceptée n'a pas fonctionné pour moi (même si elle est correcte). Mais je l'ai résolu d'une autre manière, donc je le partage ici:

Tout d’abord, je n’ai rien ajouté au fichier Gradle. J'utilise Support Library v23.4.0, car c'est le dernier en date au moment de la rédaction de ce message.

Ce qui a fonctionné pour moi est de coder en dur la couleur de teinte ou la couleur du chemin, au lieu d’utiliser une référence de ressource de couleur . Par exemple, utilisez Android:fillColor="#fff" au lieu de 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>

Observez la teinte et la couleur du chemin dans l'extrait de code ci-dessus. Auparavant, j'affectais la couleur à "@color/someColor", mais cela indiquait un avertissement indiquant que cela ne fonctionnerait que pour les versions v21 et supérieures et qu'il ne fonctionnait pas en dessous de v21. J'ai donc changé cela en une valeur codée en dur. Encore une fois, il s’agit d’une solution simple de contournement/bidouillage et probablement pas d’une solution correcte.

3
Ankit Aggarwal

J'ai écrit une fonction d'assistance (j'utilise une classe d'assistance statique avec des fonctions utiles), qui peut être appelée au début de la fonction onCreate () d'une activité:

    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);
        }
    }    

Appelez-le comme ceci dans le onCreate () de l'activité: 

Helper.setWhiteBackArrow(getSupportActionBar(), this);
0
JanScott