Comment: Définir le thème (style) de l'élément de widget personnalisé
J'ai écrit un widget personnalisé pour un contrôle que nous utilisons largement tout au long de notre application. Le widget de la classe dérive de ImageButton
et l'étend dans un couple de façons simples. J'ai défini un style qui je peux demander à le widget comme il est utilisé, mais je préfère cette série à travers un thème. Dans R.styleable
je vois widget attributs de style comme imageButtonStyle
et textViewStyle
. Est-il possible de créer quelque chose comme ça pour le widget personnalisé que j'ai écrit?
Vous devez vous connecter pour publier un commentaire.
Oui, il y a un moyen:
Supposons que vous avez une déclaration d'attributs pour votre widget (dans
attrs.xml
):Déclarer un attribut à utiliser pour un style de référence (en
attrs.xml
):Déclarer un ensemble de valeurs d'attribut par défaut pour le widget (dans
styles.xml
):Déclarer un thème personnalisé (dans
themes.xml
):Utiliser cet attribut en tant que troisième argument dans votre widget du constructeur (en
CustomImageButton.java
):Maintenant, vous devez appliquer
Theme.Custom
à toutes les activités qui utilisentCustomImageButton
(en AndroidManifest.xml):C'est tout. Maintenant
CustomImageButton
essaie de charger les valeurs d'attribut par défaut decustomImageButtonStyle
attribut du thème actuel. Si aucun attribut n'est trouvé dans le thème ou la valeur de l'attribut est@null
puis le dernier argument pourobtainStyledAttributes
seront utilisés:Widget.ImageButton.Custom
dans ce cas.Vous pouvez modifier les noms de toutes les instances et tous les fichiers (sauf
AndroidManifest.xml
), mais il serait préférable d'utiliser Android convention de nommage.customImageButtonStyle
dans cette réponse). C'est ainsi que la barre d'action personnalisé sur Android. Et si vous voulez dire que la modification d'un thème à l'exécution, alors il n'est pas possible avec cette approche.Context.obtainStyledAttributes()
pour récupérer les valeurs d'attribut. Mais pour que cela fonctionne, vous devez avoir votre thème personnalisé défini comme l'activité du thème par défaut (dernier bloc). Dans ce casdefStyle
dans le troisième constructeur sera résolu à@style/Widget.ImageButton.Custom
.name="CustomTheme"
dans ledeclare-styleable
attribut wrapper servir n'importe quel but? Est-ce seulement pour l'organisation, parce que je ne vois pas utilisé n'importe où. Puis-je mettre tous mes attributs de style pour les différents widgets dans un conteneur?declare-stylable
des blocs? ne serait-il pas de travail pour mettre l'attribut style dans le premier bloc?Un autre aspect en plus de michael excellente réponse est primordial d'attributs personnalisés dans les thèmes.
Supposons que vous avez un certain nombre de vues personnalisées qui font tous référence à l'attribut personnalisé "custom_background".
Dans un thème vous définir ce que la valeur est
ou
Vous pouvez vous référer à l'attribut dans un style
Avis le point d'interrogation, comme il est également utilisé pour la référence android attribut comme dans
Comme la plupart d'entre vous l'ont remarqué, vous pouvez et devriez probablement utiliser @références couleurs au lieu de les couleurs sont codées en dur.
Alors pourquoi ne pas simplement faire
Vous ne pouvez pas modifier la définition de "my_background_color" au moment de l'exécution, tandis que vous pouvez facilement changer de thème.