Я хочу извлечь несколько атрибутов из ресурса стиля (интересуются только атрибутами, входящими в группу TextAppearance)
Стиль, определяемый как
<style name="Label" parent="@android:style/TextAppearance.Small">
<item name="android:textColor">@color/floatlabel_text</item>
<item name="android:textSize">8dp</item>
<item name="android:textStyle">bold</item>
</style>
Сначала попробуйте
Сначала я попытался использовать TextView (строки 663-731), но потом выяснилось, что у нас нет доступа к com.android.internal.R
Частичное решение
Вот почему я переключился на это решение: qaru.site/info/77255/...
Итак, я создал textAppearanceAttr для замены com.android.internal.R.styleable.TextAppearance(содержит только 10/13 атрибутов TextAppearance, которые меня интересуют)
int[] textAppearanceAttr = new int[]{
android.R.attr.textColor,
android.R.attr.textSize,
android.R.attr.typeface,
android.R.attr.fontFamily,
android.R.attr.textStyle,
android.R.attr.textAllCaps,
android.R.attr.shadowColor,
android.R.attr.shadowDx,
android.R.attr.shadowDy,
android.R.attr.shadowRadius};
Вот как я его использовал. Я получаю идентификатор ресурса стиля (ресурс ссылается на атрибут clTextAppearance)
int ap = a.getResourceId(R.styleable.CustomLabelLayout_clTextAppearance, android.R.style.TextAppearance_Small);
TypedArray appearance = mContext.obtainStyledAttributes(ap, textAppearanceAttr);
И вот как я получаю атрибуты (все еще следуя ответам по ссылке выше):
mLabelTextColor = appearance.getColorStateList(0);
mLabelTextSize = appearance.getDimensionPixelSize(1, 15);
mLabelTypeface = appearance.getInt(2, -1);
mLabelFontFamily = appearance.getString(3);
mLabelTextStyle = appearance.getInt(4, -1);
(5 more...)
Текущий выпуск
Кажется, что установлен только атрибут first, каждый другой либо устанавливает значение по умолчанию, либо значение null.
Взлом, который, кажется, работает
Индивидуальные массивы:
int[] textSizeAttr = new int[] { android.R.attr.textSize};
int[] textStyleAttr = new int[] { android.R.attr.textStyle};
И получите такие атрибуты
appearance.recycle();
appearance = mContext.obtainStyledAttributes(ap, textSizeAttr);
mLabelTextSize = appearance.getDimensionPixelSize(0, 15);
appearance.recycle();
appearance = mContext.obtainStyledAttributes(ap, textStyleAttr);
mLabelTextStyle = appearance.getInt(0, -1);
appearance.recycle();
Теперь это такая трата.
Вопросы
- Я хотел бы знать, почему получение всех атрибутов сразу не работает.
- Есть ли решение (где вся дополнительная работа не нужна)?
РЕДАКТИРОВАТЬ 1
Я нашел здесь нечто похожее: qaru.site/info/95987/... И по какой-то причине это работает. Пока я не добавлю больше атрибутов в массив, все становится кером.
Пример:
int[] attrs = {android.R.attr.textColor,
android.R.attr.textSize,
android.R.attr.background,
android.R.attr.textStyle,
android.R.attr.textAppearance,
android.R.attr.textColorLink,
android.R.attr.orientation,
android.R.attr.text};
Если я получаю текст с использованием указанного массива, он работает.
String text = ta.getString(7);
Но если я изменил массив на ниже, он не сработал (заменил android.R.attr.orientation на android.R.attr.shadowColor)
int[] attrs = {android.R.attr.textColor,
android.R.attr.textSize,
android.R.attr.background,
android.R.attr.textStyle,
android.R.attr.textAppearance,
android.R.attr.textColorLink,
android.R.attr.shadowColor,
android.R.attr.text};
Почему это происходит? (Вопрос № 1)