179 votes

Obtenir la valeur d'une couleur par programme lorsqu'il s'agit d'une référence (thème)

Considérez 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>

Ainsi, le couleur du thème est référencé par le thème. Comment puis-je obtenir la référence theme_color de manière programmatique ? Normalement, je devrais utiliser getResources().getColor() mais pas dans ce cas car il est référencé !

331voto

Emanuel Moecklin Points 4779

Cela devrait faire l'affaire :

TypedValue typedValue = new TypedValue();
Theme theme = context.getTheme();
theme.resolveAttribute(R.attr.theme_color, typedValue, true);
@ColorInt int color = typedValue.data;

Assurez-vous également d'appliquer le thème à votre activité avant d'appeler ce code. Soit utiliser :

android:theme="@style/Theme.BlueTheme"

dans votre manifeste ou votre appel (avant d'appeler setContentView(int) ):

setTheme(R.style.Theme_BlueTheme)

sur onCreate() .

Je l'ai testé avec vos valeurs et cela a parfaitement fonctionné.

85voto

Bri6ko Points 464

Pour ajouter à la réponse acceptée, si vous utilisez kotlin.

@ColorInt
fun Context.getColorFromAttr(
    @AttrRes attrColor: Int,
    typedValue: TypedValue = TypedValue(),
    resolveRefs: Boolean = true
): Int {
    theme.resolveAttribute(attrColor, typedValue, resolveRefs)
    return typedValue.data
}

et ensuite dans votre activité vous pouvez faire

textView.setTextColor(getColorFromAttr(R.attr.color))

70voto

Chandra Sekhar Points 6512

Nous pouvons utiliser la classe utilitaire fournie par la bibliothèque Material Design :

int color = MaterialColors.getColor(context, R.attr.theme_color, Color.BLACK)

NOTE : Color.BLACK est la couleur par défaut dans le cas où l'attribut fourni à la commande u

25voto

Angel Solis Points 333

Cela a marché pour moi :

int[] attrs = {R.attr.my_attribute};
TypedArray ta = context.obtainStyledAttributes(attrs);
int color = ta.getResourceId(0, android.R.color.black);
ta.recycle();

si vous voulez obtenir la chaîne hexadécimale :

Integer.toHexString(color)

25voto

ΞXPROPACE Points 135

2021/January/8

Si vous souhaitez obtenir la couleur à partir des attributs du thème, procédez comme suit.

Créez une variable my_color et stockez la couleur à partir des attributs du thème comme,

val my_color = MaterialColors.getColor(<VIEWOBJECT>, R.attr.<YOUATRRIBUTENAME>)

À la place de <VIEWOBJECT> passe un objet de vue où vous voulez utiliser la couleur, (en coulisses, il est juste utilisé pour obtenir le contexte en tant que <VIEWOBJECT>.getContext() afin qu'il puisse accéder aux ressources, c'est-à-dire aux valeurs des attributs des thèmes. A la place de <YOURATTRIBUTENAME> Utilisez le nom de l'attribut auquel vous voulez accéder.

Exemple 1 :

Si vous voulez obtenir la couleur référencée par les attributs de thème de certaines activités. Créez une variable qui représente un objet de vue sur lequel vous voulez utiliser la couleur. Ici, j'ai un textView dans mon activité, je vais simplement référencer son objet dans la variable textview et la passe à la variable getColor et, en coulisse, il utilisera cet objet pour obtenir le contexte, afin de pouvoir accéder aux valeurs des attributs de thème.

val textview: TextView = findViewById(R.id.mytextview)
val my_color = MaterialColors.getColor(textView, R.attr<YOURATTRIBUTENAME>)

Exemple 2 :

Si vous voulez obtenir la couleur des attributs de thème dans une vue personnalisée, utilisez simplement,

val my_color = MaterialColors.getColor(this, R.attr.<YOUATRRIBUTENAME>)

Dans une vue personnalisée this fait référence à l'objet de la vue personnalisée, qui est en fait un objet de vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X