Учти это:
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>
Таким образом, на цвет темы ссылается тема. Как я могу программно получить theme_color (reference)? Обычно я бы использовал, getResources().getColor()
но не в этом случае, потому что на него есть ссылка!
android
android-resources
android-theme
Серафима
источник
источник
ContextThemeWrapper
помощью идентификатора темы, а затем извлечь из него тему.Чтобы добавить к принятому ответу, если вы используете kotlin.
а затем в своей деятельности вы можете делать
textView.setTextColor(getColorFromAttr(R.attr.color))
источник
@ColorInt fun Context.getThemeColor(@AttrRes attribute: Int) = TypedValue().let { theme.resolveAttribute(attribute, it, true); it.data }
(здесь плохо отформатирован, но это нормально)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
, даже если он ссылается на другие атрибуты темы:fun Context.getThemeColor(@AttrRes attribute: Int): ColorStateList = TypedValue().let { theme.resolveAttribute(attribute, it, true); AppCompatResources.getColorStateList(this, it.resourceId) }
(отдельные цвета также будут обернутыColorStateList
).Это сработало для меня:
если вы хотите получить из него шестнадцатеричную строку:
источник
Если вы хотите получить несколько цветов, вы можете использовать:
источник
Добавьте это в свой build.gradle (приложение):
И добавьте эту функцию расширения где-нибудь в свой код:
источник
Вот краткий служебный метод Java, который принимает несколько атрибутов и возвращает массив целых чисел цвета. :)
источник
Для тех, кто ищет ссылку на чертеж, вы должны использовать
false
вresolveRefs
theme.resolveAttribute(R.attr.some_drawable, typedValue, **false**);
источник