Я использую пользовательские атрибуты для реализации переключения тем в моем приложении. У меня есть следующий атрибут:
<resources>
<attr name="TextAppearance_Footer" format="reference"></attr>
</resources>
У меня есть две темы, которые по-разному определяют этот атрибут:
<style name="NI_AppTheme.Dark">
<item name="TextAppearance_Footer">@style/Footer</item>
</style>
@style/Footer
определяется следующим образом:
<style name="Footer" parent="@android:style/TextAppearance.Large">
<item name="android:textColor">#00FF00</item> // Green
</style>
Теперь, если я попытаюсь установить этот стиль на TextView
, используя:
textView.setTextAppearance(this, R.attr.TextAppearance_Footer);
Это не работает (то есть не устанавливает текст в Зеленый). Однако, если я укажу внешний вид текста через xml, используя:
android:textAppearance="?TextAppearance_Footer"
Работает нормально. Чего мне не хватать? Мне нужно установить атрибуты, потому что я хочу динамически переключаться между темами.
Дополнительная информация:
Если я использую:
textView.setTextAppearance(this, R.style.NI_AppTheme.Dark);
Кажется, все в порядке.
РЕДАКТИРОВАТЬ: протестированное рабочее решение (спасибо @nininho):
Resources.Theme theme = getTheme();
TypedValue styleID = new TypedValue();
if (theme.resolveAttribute(R.attr.Channel_Title_Style, styleID, true)) {
channelTitle.setTextAppearance(this, styleID.data);
}