Considere isto:
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>
Portanto, a cor do tema é referenciada pelo tema. Como posso obter o theme_color (referência) programaticamente? Normalmente eu usaria, getResources().getColor()
mas não neste caso porque é referenciado!
android
android-resources
android-theme
Serafim
fonte
fonte
ContextThemeWrapper
usando o id do tema e, em seguida, recuperar o tema a partir dele.Para adicionar à resposta aceita, se você estiver usando kotlin.
e então em sua atividade você pode fazer
textView.setTextColor(getColorFromAttr(R.attr.color))
fonte
@ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = TypedValue().let { theme.resolveAttribute(attribute, it, true); it.data }
(mal formatado aqui, mas 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) }
ColorStateList
, mesmo que faça referência a outros atributos do tema:fun Context.getThemeColor(@AttrRes attribute: Int): ColorStateList = TypedValue().let { theme.resolveAttribute(attribute, it, true); AppCompatResources.getColorStateList(this, it.resourceId) }
(cores únicas também serão envolvidas em umColorStateList
).Isso funcionou para mim:
se você quiser tirar o hexstring dele:
fonte
Se você deseja obter várias cores, pode usar:
fonte
Adicione isso ao seu build.gradle (app):
E adicione esta função de extensão em algum lugar do seu código:
fonte
Aqui está um método utilitário Java conciso que usa vários atributos e retorna uma matriz de inteiros coloridos. :)
fonte
Para aqueles que procuram uma referência para um drawable, você deve usar
false
emresolveRefs
theme.resolveAttribute(R.attr.some_drawable, typedValue, **false**);
fonte