Tout d'abord, cette question pose une question très similaire. Cependant, ma question a une différence subtile.
Ce que j'aimerais savoir, c'est s'il est possible de changer par programme l' colorPrimary
attribut d'un thème en une couleur arbitraire ?
Ainsi par exemple, nous avons:
<style name="AppTheme" parent="android:Theme.Material.Light">
<item name="android:colorPrimary">#ff0000</item>
<item name="android:colorAccent">#ff0000</item>
</style>
Au moment de l'exécution, l'utilisateur décide qu'il souhaite l'utiliser #ccffff
comme couleur principale. Bien sûr, je ne peux pas créer de thèmes pour toutes les couleurs possibles.
Cela ne me dérange pas si je dois faire des trucs piratés, comme compter sur les internes privés d'Android, tant que cela fonctionne en utilisant le SDK public.
Mon objectif est finalement d'avoir le ActionBar
et tous les widgets comme un CheckBox
pour utiliser cette couleur primaire.
android
android-5.0-lollipop
nhaarman
la source
la source
Réponses:
Les thèmes sont immuables, vous ne pouvez pas.
la source
J'ai lu les commentaires sur l'application Contacts et comment elle utilise un thème pour chaque contact.
Probablement, l'application Contacts a des thèmes prédéfinis (pour chaque couleur primaire du matériau à partir d'ici: http://www.google.com/design/spec/style/color.html ).
Vous pouvez appliquer un thème avant une méthode setContentView dans la méthode onCreate.
Ensuite, l'application Contacts peut appliquer un thème au hasard à chaque utilisateur.
Cette méthode est:
Mais cette méthode pose un problème, par exemple, elle peut changer la couleur de la barre d'outils, la couleur de l'effet de défilement, la couleur de l'ondulation, etc., mais elle ne peut pas changer la couleur de la barre d'état et la couleur de la barre de navigation (si vous voulez aussi la changer).
Ensuite, pour résoudre ce problème, vous pouvez utiliser la méthode avant et:
Ces deux méthodes modifient la navigation et la couleur de la barre d'état. N'oubliez pas que si vous définissez votre barre de navigation translucide, vous ne pouvez pas changer sa couleur.
Cela devrait être le code final:
Vous pouvez utiliser un commutateur et générer un nombre aléatoire pour utiliser des thèmes aléatoires, ou, comme dans l'application Contacts, chaque contact a probablement un numéro prédéfini associé.
Un échantillon de thème:
Désolé pour mon anglais.
la source
Vous pouvez utiliser Theme.applyStyle pour modifier votre thème lors de l'exécution en lui appliquant un autre style.
Disons que vous avez ces définitions de style:
Vous pouvez maintenant patcher votre thème au moment de l'exécution comme ceci:
La méthode
applyStyle
doit être appelée avant que la mise en page ne soit gonflée! Donc, à moins que vous ne chargiez la vue manuellement, vous devez appliquer des styles au thème avant d'appelersetContentView
votre activité.Bien entendu, cela ne peut pas être utilisé pour spécifier une couleur arbitraire, c'est-à-dire une couleur sur 16 millions (256 3 ). Mais si vous écrivez un petit programme qui génère les définitions de style et le code Java pour vous, alors quelque chose comme un sur 512 (8 3 ) devrait être possible.
Ce qui rend cela intéressant, c'est que vous pouvez utiliser différentes superpositions de style pour différents aspects de votre thème. Ajoutez simplement quelques définitions de superposition
colorAccent
par exemple. Vous pouvez désormais combiner des valeurs différentes pour la couleur primaire et la couleur d'accent presque arbitrairement.Vous devez vous assurer que vos définitions de thème de superposition n'héritent pas accidentellement d'un ensemble de définitions de style d'une définition de style parent. Par exemple, un style appelé
AppTheme.OverlayRed
hérite implicitement de tous les styles définis dansAppTheme
et toutes ces définitions seront également appliquées lorsque vous corrigez le thème principal. Donc, évitez les points dans les noms de thème de superposition ou utilisez quelque chose commeOverlay.Red
et définissez-leOverlay
comme un style vide.la source
applyStyle
avant d'appelersetContentView
votre activité et cela devrait fonctionner.J'ai créé une solution pour créer des thèmes de n'importe quelle couleur, peut-être que cela peut être utile pour quelqu'un. API 9+
1. créez d'abord " res / values-v9 / " et placez-y ce fichier: styles.xml et le "res / values" normal sera utilisé avec vos styles.
2. mettez ce code dans votre res / values / styles.xml:
3. dans AndroidManifest:
4. créez une nouvelle classe avec le nom "ThemeColors.java"
5. MainActivity:
Pour changer de couleur, remplacez simplement Random par votre RVB, j'espère que cela vous aidera.
Il existe un exemple complet: ColorTest.zip
la source
context.setTheme(context.getResources().getIdentifier("T_" + stringColor, "style", context.getPackageName()));
pouvez-vous me donner une explication ou un lien pour suivre ce sujet?J'ai utilisé le code de Dahnark mais j'ai également besoin de changer l'arrière-plan de ToolBar:
la source
Vous ne pouvez pas changer la couleur de colorPrimary, mais vous pouvez changer le thème de votre application en ajoutant un nouveau style avec une couleur différente
et à l'intérieur du thème de l'ensemble d'activités
la source
à partir d'une activité que vous pouvez faire:
la source
UTILISEZ UNE BARRE D'OUTILS
Vous pouvez définir dynamiquement une couleur d'élément de barre d'outils personnalisée en créant une classe de barre d'outils personnalisée:
puis faites-y référence dans votre fichier de mise en page. Vous pouvez maintenant définir une couleur personnalisée en utilisant
Sources:
J'ai trouvé les informations pour le faire ici: Comment changer dynamiquement la couleur des icônes de la barre d'outils Android
puis je l'ai édité, amélioré et posté ici: GitHub: AndroidDynamicToolbarItemColor
la source
Voici ce que vous POUVEZ faire:
écrire un fichier dans un dossier dessinable, appelons-le background.xml
puis définissez votre mise en page (ou quel que soit le cas)
android:background="@drawable/background"
lors de la définition de votre thème, cette couleur représenterait la même chose.
la source