Как использовать атрибут темы в качестве селектора цветов

Я хотел бы определить список состояний цвета для моего текстового поля, который по умолчанию использует primaryTextColor и colorAccent, когда «активирован». Мое определение:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:color="?android:attr/colorAccent" android:state_activated="true"/> <item android:color="?android:attr/textColorPrimary"/> </selector> 

Это не работает (я всегда получаю красный цвет, который, я думаю, является интерпретацией id как цвета argb).

Что я могу сделать, чтобы указать цвета, которые зависят от темы?

Я считаю, что это невозможно из XML прямо сейчас. Я знаю, что фреймворк Android только добавил поддержку атрибутов темы в выделенных ресурсах в Lollipop, и он не работает ниже API 21. Я считаю, что цветовые ресурсы никогда не получали поддержки.

Однако вы можете сделать это из кода!

 final TypedArray attributes = itemView.getContext().obtainStyledAttributes(R.styleable.WowSdkSongViewHolder); try { int colorAccent = attributes.getColor(R.styleable.WowSdkSongViewHolder_colorAccent, 0); final int textColorPrimary = attributes.getColor( R.styleable.WowSdkSongViewHolder_android_textColorPrimary, 0); title.setTextColor(new ColorStateList( new int[][] { ThemeUtils.ACTIVATED_STATE_SET, ThemeUtils.EMPTY_STATE_SET }, new int[] { colorAccent, textColorPrimary })); } finally { attributes.recycle(); } 

Сначала вам нужно получить значения для атрибутов в текущей теме, как обычно. Затем вам нужно создать объект ColorStateList . Конструктор принимает массив списков состояний (фактически массивы состояний, то есть это int[][] ) и массив соответствующих цветов. Затем вы можете установить этот ColorStateList в TextView с перегрузкой setTextColor .

AppCompat имеет некоторые удобные константы, определенные в ThemeUtils . Однако этот класс скрыт и во внутреннем пакете, поэтому я предлагаю скопировать то, что вам нужно, на свой собственный ThemeUtils .