Joindre des CardView de style à thème
Dans mon application, j'ai deux thèmes (clair et foncé), et je souhaite à tous de mon CardView
s pour changer leur couleur de fond en fonction dont le thème est sélectionné.
Ce que je ne pas voulez, c'est:
<android.support.v7.widget.CardView
style="@style/CardView.MyBlue"
android:layout_width="200dp"
android:layout_height="100dp"
android:layout_gravity="center_horizontal">
Le code ci-dessus n'est pas dynamique. J'ai besoin de mes deux styles pour être appliqué automatiquement en fonction de si une lumière ou d'un thème sombre est sélectionné.
Ce que j'ai en ce moment ne fonctionne pas:
<style name="AppTheme.Light" parent="Theme.AppCompat.Light">
...
<item name="cardViewStyle">@style/CardViewStyle.Light</item>
</style>
<style name="AppTheme.Dark" parent="Theme.AppCompat">
...
<item name="cardViewStyle">@style/CardViewStyle.Dark</item>
</style>
<style name="CardViewStyle.Light" parent="CardView">
<item name="cardBackgroundColor">@color/cardview_dark_background</item>
</style>
<style name="CardViewStyle.Dark" parent="CardView">
<item name="cardBackgroundColor">@color/cardview_light_background</item>
</style>
J'ai lu quelque part que vous pouvez définir un styleable.xml
fichier dans /res/values/
à la clé, le mot cardViewStyle
, donc je l'ai fait:
styleable.xml:
<resources>
<declare-styleable name="AppTheme">
<attr name="cardViewStyle" format="reference" />
</declare-styleable>
</resources>
Mise à jour
Question similaire ici avec pas de réponse non plus.
Vous devez vous connecter pour publier un commentaire.
Dans styles.xml
Puis dans l'autre xml à utiliser le nouvel attribut, vous pouvez l'utiliser comme ceci
Pour afficher plus de détails sur la façon de mettre en œuvre de David Park est la solution...
Mettre cela en attrs.xml:
Ensuite, ajouter cardStyle à votre thème styles.xml:
Puis utilisez le attr partout où vous avez une CardView:
<declare-styleable/>
vraiment nécessaire ou est en train de mettre<attr format="reference" name="cardStyle"/>
dansstyles.xml
sous<resources/>
une abréviation?defStyleAttr
donc le seul moyen que je vois est à la sous-classe et de transmettre notre attribut personnalisé en tant que par défaut. Voir ma réponse pour plus de détails.Si vous ne voulez pas ajouter de
style="?cardViewStyle"
à chaqueCardView
dans vos mises en page, vous pouvez sous-classeCardView
et définissez l'attribut style dans le constructeur (dommage qu'ils ne font pas que dans la bibliothèque de prise en charge). Utilisez ensuite cette sous-classe dans le fichier XML, au lieu deCardView
.L'attribut
cardViewStyle
doit être défini, par exemple dansattrs.xml
comme:Vous aurez besoin de définir cet attribut dans votre thème, comme d'habitude:
Et de définir le style lui-même, par exemple:
La seule solution que j'ai été en mesure de venir avec est de maintenir manuellement une constante variable pour la carte de la couleur doit être après chaque changement de thème. Ensuite, je reçois chaque instance d'une carte qui est dans mon application et de définir sa couleur à celle de la constante variable.
Donc, j'ai un BaseActivity à partir de laquelle l'ensemble de mes activités s'étendent à partir de. Pour cela, j'ai la poignée de la carte de changement de couleur, en plus de traiter le thème. Voir ci-dessous:
BaseActivity.java
:Ce n'est certainement pas la meilleure façon de le faire, mais jusqu'à ce que quelqu'un d'autre peut trouver une meilleure façon de mettre en œuvre le style, c'est tout ce que je peux penser.