Considère ceci:
styles.xml
<style name="BlueTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="theme_color">@color/theme_color_blue</item>
</style>
attrs.xml
<attr name="theme_color" format="reference" />
color.xml
<color name="theme_color_blue">#ff0071d3</color>
La couleur du thème est donc référencée par le thème. Comment puis-je obtenir le theme_color (référence) par programmation? Normalement j'utiliserais getResources().getColor()
mais pas dans ce cas car c'est référencé!
android
android-resources
android-theme
Séraphins
la source
la source
ContextThemeWrapper
à l'aide de l'ID de thème, puis récupérer le thème à partir de celui-ci.Pour ajouter à la réponse acceptée, si vous utilisez kotlin.
et puis dans ton activité tu peux faire
textView.setTextColor(getColorFromAttr(R.attr.color))
la source
@ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = TypedValue().let { theme.resolveAttribute(attribute, it, true); it.data }
(mal formaté ici mais c'est ok)val errorColor = context.getThemeColor(R.attr.colorError)
ColorStateList
:@ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = obtainStyledAttributes(intArrayOf(attribute)).use { it.getColor(0, Color.MAGENTA) }
(de Nick Butcher )ColorStateList
, même s'il fait référence à un autre attribut de thème:fun Context.getThemeColor(@AttrRes attribute: Int): ColorStateList = TypedValue().let { theme.resolveAttribute(attribute, it, true); AppCompatResources.getColorStateList(this, it.resourceId) }
(les couleurs uniques seront également enveloppées dans unColorStateList
).Cela a fonctionné pour moi:
si vous voulez en extraire la chaîne hexadécimale:
la source
Si vous souhaitez obtenir plusieurs couleurs, vous pouvez utiliser:
la source
Ajoutez ceci à votre build.gradle (application):
Et ajoutez cette fonction d'extension quelque part dans votre code:
la source
Voici une méthode d'utilitaire Java concise qui prend plusieurs attributs et renvoie un tableau d'entiers de couleur. :)
la source
Pour ceux qui recherchent une référence à un dessinable, vous devriez utiliser
false
dansresolveRefs
theme.resolveAttribute(R.attr.some_drawable, typedValue, **false**);
la source