2017-08-28 7 views
2

Comment teinter icônes de menu est déjà couvert plusieurs fois, comme ici: Toolbar icon tinting on AndroidTint Navigation icône dans la barre d'outils

De plus à cette solution, il reste le problème de l'icône de navigation. L'application d'un thème (recouvrement) à la barre d'outils teintes uniquement le texte et les icônes de la liste blanche (voir: https://stackoverflow.com/a/26817918/2417724)

Si vous définissez une icône personnalisée (qui se trouve être assez facile le cas, comme vous devez le changer si vous ne voulez pas afficher la flèche arrière par défaut), cette icône personnalisée ne sera pas teintée.

Comment gérez-vous vos icônes alors? Toutes mes icônes sont par défaut noires et je ne veux pas avoir des versions blanches spéciales juste pour les utiliser dans la barre d'outils alors.

Répondre

3

Le bouton de navigation appcompat - qui est simplement un AppCompatImageButton - peut être désigné par l'attribut toolbarNavigationButtonStyle. Le style par défaut pour cela dans les thèmes AppCompat est Widget.AppCompat.Toolbar.Button.Navigation, et nous pouvons étendre ce style pour ajouter une valeur d'attribut tint. Par exemple:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    ... 

    <item name="toolbarNavigationButtonStyle">@style/Toolbar.Button.Navigation.Tinted</item> 

</style> 

<style name="Toolbar.Button.Navigation.Tinted" parent="Widget.AppCompat.Toolbar.Button.Navigation"> 
    <item name="tint">@color/nav_button_tint</item> 
</style> 

Il y a quelques mises en garde à connaître lors de l'utilisation de cette méthode.

Avant de soutenir la version bibliothèque 25.4.0, AppCompatImageButton n'a pas offert son propre attribut tint, et donc un attribut tint dans l'espace de noms de l'application ne sera pas applicable (et tout simplement pas exister, à moins que définies ailleurs). Il est nécessaire d'utiliser l'attribut android:tint de la plateforme si vous utilisez la bibliothèque de support version 25.3.0 ou antérieure.

Malheureusement, cela conduit à une autre prise, en ce que la teinte de la plate-forme avant Lollipop (niveau API 21) ne peut traiter que de simples, des valeurs de couleur unique, et en utilisant une valeur de ressources ColorStateList (<selector>) provoquera une Exception à être jeté . Cela ne pose aucun problème si la valeur android:tint est une couleur simple, mais il est souvent souhaité de colorer l'icône de navigation pour correspondre à un autre attribut de couleur de thème, qui peut très bien être un ColorStateList. Dans ce cas, il est nécessaire de créer des styles distincts dans res/values/ et res/values-21/, en spécifiant une valeur de couleur simple pour android:tint dans res/values/.

Par exemple, si teinter pour correspondre à la couleur du texte principal du thème:

res/values/styles.xml

<item name="android:tint">@color/normal_text_color</item> 

res/values-v21/styles.xml

<item name="android:tint">?android:textColorPrimary</item> 

Il vous suffit de vous préoccuper des notes ci-dessus si vous êtes coincé en utilisant une version de bibliothèque de support inférieure à 25.4.0.