Как использовать getStyledAttributes(int []) с внутренними темами Android
-
22-09-2019 - |
Вопрос
Итак, я осмотрелся и обнаружил, что android.R.styleable
больше не является частью SDK, хотя все еще документировано. здесь.
Это не было бы проблемой, если бы было четко задокументировано, какова альтернатива.Например, приложение AOSP Calendar по-прежнему использует android.R.styleable
// Get the dim amount from the theme
TypedArray a = obtainStyledAttributes(com.android.internal.R.styleable.Theme);
lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
a.recycle();
Так как же получить backgroundDimAmount
не получив int[]
от android.R.styleable.Theme
?
Что я должен придерживаться obtainStyledAttributes(int [])
чтобы заставить его работать с SDK?
Решение
Демонстрация CustomView API показывает, как получить стилизованные атрибуты.Код представления находится здесь:
Стилизуемый массив, используемый для получения текста, цвета и размера, определен в файле <declare-styleable>
раздел здесь:
Вы можете использовать <declare-styleable>
чтобы определить любой список атрибутов, которые вы хотите получить, как группу, содержащую как ваши собственные, так и атрибуты, определенные платформой.
Что касается этих вещей, описанных в документации, то по стилевым массивам есть много документации Java, что делает их полезными для включения в документацию, поэтому они остались там.Однако по мере изменения массивов, например, при добавлении новых атрибутов, значения констант могут меняться, поэтому платформенные константы не могут находиться в SDK (и, пожалуйста, не используйте никаких уловок, чтобы попытаться получить к ним доступ).В любом случае не должно быть необходимости использовать платформенные, потому что каждый из них предназначен только для реализации частей фреймворка, и создать свой собственный, как показано здесь, несложно.
Другие советы
В примере они пропустили ссылку на контекст «c»:
public ImageAdapter(Context c) {
TypedArray a = c.obtainStyledAttributes(R.styleable.GalleryPrototype);
mGalleryItemBackground = a.getResourceId(
R.styleable.GalleryPrototype_android_galleryItemBackground, 0);
a.recycle();
return mGalleryItemBackground;
}
Изменение getStyledAttributes на c.obtainStyledAttributes должно работать
Пример извлечения стандартного атрибута (фона) в пользовательском представлении, имеющем собственный стиль по умолчанию.В этом примере пользовательское представление Сетка паролей простирается Макет сетки.Я указал стиль для PasswordGrid, который устанавливает фоновое изображение с использованием стандартного атрибута Android. Android: фон.
public class PasswordGrid extends GridLayout {
public PasswordGrid(Context context) {
super(context);
init(context, null, 0);
}
public PasswordGrid(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.passwordGridStyle);
init(context, attrs, 0);
}
public PasswordGrid(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs, defStyle);
}
private void init(Context context, AttributeSet attrs, int defStyle) {
if (!isInEditMode()) {
TypedArray stdAttrs = context.obtainStyledAttributes(attrs,
new int[] { android.R.attr.background }, // attribute[s] to access
defStyle,
R.style.PasswordGridStyle); // Style to access
// or use any style available in the android.R.style file, such as
// android.R.style.Theme_Holo_Light
if (stdAttrs != null) {
Drawable bgDrawable = stdAttrs.getDrawable(0);
if (bgDrawable != null)
this.setBackground(bgDrawable);
stdAttrs.recycle();
}
}
}
Вот часть моего файла Styles.xml:
<declare-styleable name="passwordGrid">
<attr name="drawOn" format="color|reference" />
<attr name="drawOff" format="color|reference" />
<attr name="pathWidth" format="integer" />
<attr name="pathAlpha" format="integer" />
<attr name="pathColor" format="color" />
</declare-styleable>
<style name="PasswordGridStyle" parent="@android:style/Widget.GridView" >
<!-- Style custom attributes. -->
<item name="drawOff">@drawable/ic_more</item>
<item name="drawOn">@drawable/ic_menu_cut</item>
<item name="pathWidth">31</item>
<item name="pathAlpha">129</item>
<item name="pathColor">@color/green</item>
<!-- Style standard attributes -->
<item name="android:background">@drawable/pattern_bg</item>
</style>
Похоже, это ошибка в SDK.я подал проблема на нем, который вы, возможно, захотите отметить, чтобы получать обновления.
В качестве обходного пути вы можете использовать отражение для доступа к полю:
Class clazz=Class.forName("android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);