MenuItem teinture sur AppCompat de la Barre d'outils
Lorsque j'utilise un drawable de la AppCompat
bibliothèque pour mon Toolbar
les éléments de menu de la teinte fonctionne comme prévu. Comme ceci:
<item
android:id="@+id/action_clear"
android:icon="@drawable/abc_ic_clear_mtrl_alpha" <-- from AppCompat
android:title="@string/clear" />
Mais si j'utilise mon propre un drawable ou même de copier l'un drawable de la AppCompat
bibliothèque de mon propre projet, il ne sera pas teinte à tous.
<item
android:id="@+id/action_clear"
android:icon="@drawable/abc_ic_clear_mtrl_alpha_copy" <-- copy from AppCompat
android:title="@string/clear" />
Est-il quelque chose de magique dans la AppCompat
Toolbar
que seule teinte un drawable à partir de cette bibliothèque? De toute façon, pour obtenir que cela fonctionne avec mon propre un drawable?
L'exécution de cette API de Niveau 19 de l'appareil avec compileSdkVersion = 21
et targetSdkVersion = 21
, et aussi en utilisant tout de AppCompat
abc_ic_clear_mtrl_alpha_copy
est une copie exacte de la abc_ic_clear_mtrl_alpha
png de AppCompat
Edit:
La teinte est basé sur la valeur que j'ai mis pour android:textColorPrimary
dans mon thème.
E. g. <item name="android:textColorPrimary">#00FF00</item>
pourrait me donner une teinte verte de la couleur.
Captures d'écran
Teinture de travail comme prévu avec drawable de AppCompat
Teinture de ne pas travailler avec drawable copié à partir de AppCompat
- Les deux styles ont le même parent? Si vous étendez le haut de style avec votre propre?
- Il n'y a pas de différence dans les styles. La seule différence est le drawable, qui sont les deux .les fichiers png
- Le drawable ressemble à une copie exacte de l'original AppCombat drawable dans le code?
- Ils sont des fichiers png, dont j'ai copié. Ils sont exactement les mêmes.
- Alors, où, exactement, est-ce que votre code différer de l'original si il a le même style et la même image?
- C'est un peu ce que cette question est tout au sujet.
- Qu'entendez-vous par teinture fonctionne comme prévu. Quelle est la teinte de la couleur et où est-il défini?
- Veuillez voir le post mis à jour
- pouvez-vous mettre des captures d'écran de ce qui se passe?
- Mis à jour le post avec les captures d'écran pour expliquer le problème
- J'ai ajouté une solution qui n'utilise pas de réflexion/view de recherche ou de tout autre ducktapes. C'est propre et flexible, prendre un coup d'oeil à mon post
Vous devez vous connecter pour publier un commentaire.
Parce que si vous regardez le code source de la TintManager dans AppCompat, vous verrez:
Qui signifie en gros ils ont notamment resourceIds dans la liste blanche pour être teinté.
Mais je suppose que vous pouvez toujours voir comment ils sont teinture de ces images et de faire de même. C'est aussi simple que de définir la ColorFilter sur un drawable.
Après la nouvelle bibliothèque de prise en charge v22.1, vous pouvez utiliser quelque chose de similaire à ceci:
setColorFilter()
est préférable.unwrap
pour obtenir l'original de type drawable; et plus important encore, (2) l'enveloppant d'un drawable les magasins de la couleur instance dans une (petite mais pertinente) cache pour appcompat chargeur de ressources, ce qui signifie que la prochaine fois que vous essayez de charger le même drawable, vous obtenez le recoloriés instance.Définition d'un
ColorFilter
(teinte) sur unMenuItem
est simple. Voici un exemple:Le code ci-dessus est très utile si vous voulez soutenir les différents thèmes et vous ne voulez pas avoir des copies supplémentaires juste pour la couleur ou la transparence.
Cliquez ici pour une classe d'assistance pour définir un
ColorFilter
sur tous les un drawable dans un menu, y compris l'icône de débordement.Dans
onCreateOptionsMenu(Menu menu)
appelez simplementMenuColorizer.colorMenu(this, menu, color);
après gonfler votre menu et le tour est joué; vos icônes sont teintées.Personnellement, j'ai préféré cette approche à partir de ce lien
Créer un fichier XML de mise en page avec les éléments suivants:
et de référence de cette drawable à partir de votre menu:
bitmap
. Il y a d'autres façons de couleur vecteurs. Peut-être quelqu'un pourrait ajouter vecteur coloriage ici aussi...app:iconTint
attribut est mis en œuvre dansSupportMenuInflater
à partir de la bibliothèque de prise en charge (au moins dans 28.0.0).Testé avec succès avec l'API de 15 ans et plus.
Menu fichier de ressources:
(Dans ce cas
?attr/appIconColorEnabled
était une coutume attribut de couleur dans l'application de thèmes, et l'icône de ressources ont été vecteur d'un drawable.)La plupart des solutions dans ce fil soit utiliser une API plus récente, ou utiliser la réflexion, ou de l'utilisation intensive de vue de recherche pour se rendre à l'gonflé
MenuItem
.Cependant, il y a une approche élégante de le faire. Vous avez besoin d'une Barre d'outils personnalisée, comme votre "appliquer la coutume teinte cas d'utilisation" n'est pas de bien jouer avec le public le style/la thématisation de l'API.
Assurez-vous juste que vous appelez dans votre Activité/Fragment de code:
Pas de réflexion, pas de vue de recherche, et pas tellement de code, hein?
Et maintenant, vous pouvez ignorer le ridicule
onCreateOptionsMenu/onOptionsItemSelected
.Menu#getItem()
la complexité est O(1) dans la barre d'outils, car les éléments sont stockés dans la liste de tableaux. Ce qui est différent deView#findViewById
traversal (que j'ai appelé afficher de recherche dans ma réponse), la complexité de ce qui est loin d'être constante 🙂Voici la solution que j'utilise; vous pouvez l'appeler après onPrepareOptionsMenu() ou l'équivalent de la place. La raison pour muter() si vous arrive d'utiliser les icônes dans plus d'un endroit; sans la transformer, ils vont tous être sur la même teinte.
Ce ne sera pas prendre soin de la zone de débordement, mais pour cela, vous pouvez faire ceci:
Mise en page:
Styles:
Cela fonctionne de la manière de appcompat v23.1.0.