Obtenir la valeur de couleur par programmation quand il s’agit d’une référence (thème)

Considère ceci:

styles.xml

 @color/theme_color_blue  

attrs.xml

  

color.xml

 #ff0071d3 

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 il est référencé!

Cela devrait faire le travail:

 TypedValue typedValue = new TypedValue(); Theme theme = context.getTheme(); theme.resolveAtsortingbute(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 appel (avant d’appeler setContentView(int) ):

 setTheme(R.style.Theme_BlueTheme) 

dans onCreate() .

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

Cela a fonctionné pour moi:

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

si vous voulez en extraire la chaîne hexagonale:

 Integer.toHexSsortingng(color) 

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

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

et puis dans votre activité, vous pouvez faire

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

Si vous souhaitez obtenir plusieurs couleurs, vous pouvez utiliser:

 int[] attrs = {R.attr.customAttr, android.R.attr.textColorSecondary, android.R.attr.textColorPrimaryInverse}; Resources.Theme theme = context.getTheme(); TypedArray ta = theme.obtainStyledAtsortingbutes(attrs); int[] colors = new int[attrs.length]; for (int i = 0; i < attrs.length; i++) { colors[i] = ta.getColor(i, 0); } ta.recycle();