Considera esto:
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>
Por tanto, el tema hace referencia al color del tema. ¿Cómo puedo obtener el theme_color (referencia) mediante programación? Normalmente lo usaría, getResources().getColor()
pero no en este caso porque se hace referencia.
android
android-resources
android-theme
Serafines
fuente
fuente
ContextThemeWrapper
usando la identificación del tema y luego recuperar el tema de allí.Para agregar a la respuesta aceptada, si está usando kotlin.
y luego en tu actividad puedes hacer
textView.setTextColor(getColorFromAttr(R.attr.color))
fuente
@ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = TypedValue().let { theme.resolveAttribute(attribute, it, true); it.data }
(mal formateado aquí pero está bien)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
, incluso si hace referencia a los atributos de otro tema:fun Context.getThemeColor(@AttrRes attribute: Int): ColorStateList = TypedValue().let { theme.resolveAttribute(attribute, it, true); AppCompatResources.getColorStateList(this, it.resourceId) }
(los colores individuales también se incluiránColorStateList
).Esto funcionó para mí:
si quieres sacar la cadena hexadecimal:
fuente
Si desea obtener varios colores, puede usar:
fuente
Agregue esto a su build.gradle (aplicación):
Y agregue esta función de extensión en algún lugar de su código:
fuente
Aquí hay un método de utilidad de Java conciso que toma múltiples atributos y devuelve una matriz de enteros de color. :)
fuente
Para aquellos que buscan una referencia a un dibujable, debe usar
false
enresolveRefs
theme.resolveAttribute(R.attr.some_drawable, typedValue, **false**);
fuente