Как получить массив целочисленных ресурсов через типизированный массив?

В 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();
}
Другие вопросы по тегам