Как получить массив целочисленных ресурсов через типизированный массив?
В attr.xml я объявил следующие декларируемые стили:
<declare-styleable name="SideSpinnerAttrs">
<attr name="stringValues" format="reference" />
<attr name="iconIDs" format="reference"/>
</declare-styleable>
Массив значков ресурсов в array.xml:
<integer-array name="spinnerIcons">
<item>@drawable/ic_attachment_black_24dp</item>
<item>@drawable/ic_audiotrack_black_24dp</item>
<item>@drawable/ic_slideshow_black_24dp</item>
</integer-array>
Я хотел бы позвонить и установить эти значки из массива в imageView:
private void readSpinnerIcons(Context context, AttributeSet attrs) {
TypedArray icons=context.obtainStyledAttributes(attrs,R.styleable.SideSpinnerAttrs);
int id=icons.getResourceId(R.styleable.SideSpinnerAttrs_iconIDs,0);
int[] i=getResources().getIntArray(id);
spinner_icon.setBackgroundResource(i[0]);
}
Но массив "int[] i" пуст. Зачем?
2 ответа
Например:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<integer-array name="IntArray">
<item>2</item>
<item>8</item>
<item>10</item>
<item>16</item>
</integer-array>
</resources>
Вы можете использовать это
Resources r = getResources();
int[] bases = r.getIntArray(R.array.IntArray);
Проблема в этой строке:
int id=icons.getResourceId(R.styleable.SideSpinnerAttrs_iconIDs,0);
Первый аргумент не является Styleable
идентификатор ресурса, а точнее индекс TypedArray, содержащий идентификатор ресурса. Поскольку вы не предоставляете действительный индекс, id
всегда будет значением по умолчанию, которое вы используете в качестве второго аргумента, что означает, что ваш int[]
массив i
всегда будет пустым.
Кроме того, убедитесь, что вы всегда вызываете recycle(), как только вы закончите, используя TypedArray
, Используйте следующее:
private void readSpinnerIcons(Context context) {
TypedArray icons = context.obtainStyledAttributes(new int[] {R.styleable.SideSpinnerAttrs});
int id = icons.getResourceId(0, 0);
int[] i = getResources().getIntArray(id);
spinner_icon.setBackgroundResource(i[0]);
icons.recycle();
}