setTextAppearance через код, ссылающийся на пользовательский атрибут - PullRequest
5 голосов
/ 06 января 2012

Я использую пользовательские атрибуты для реализации переключения тем в моем приложении. У меня есть следующий атрибут:

<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);
}

1 Ответ

11 голосов
/ 06 января 2012

Почему бы не использовать:

textView.setTextAppearance(this, R.style.Footer);

Я думаю, что textAppearance должно быть стилем.

Edit:

Может быть, вам стоит попробовать это:

TypedArray a = context.obtainStyledAttributes(attrs,
new int[] { R.attr.TextAppearance_Footer });

int id = a.getResourceId(R.attr.TextAppearance_Footer, defValue);
textView.setTextAppearance(this, id);

EDIT: Правильный проверенный код:

Resources.Theme theme = getTheme();
TypedValue styleID = new TypedValue();
if (theme.resolveAttribute(R.attr.Channel_Title_Style, styleID, true)) {
     channelTitle.setTextAppearance(this, styleID.data);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...