Хранение идентификаторов R.drawable в массиве XML - PullRequest
141 голосов
/ 04 августа 2011

Я хотел бы сохранить идентификатор нарисованных ресурсов в виде R.drawable.* внутри массива с использованием файла значений XML, а затем получить массив в моей деятельности.

Есть идеи, как этого добиться?

Ответы [ 5 ]

344 голосов
/ 04 августа 2011

Вы используете типизированный массив в arrays.xml файле в папке /res/values, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <integer-array name="random_imgs">
        <item>@drawable/car_01</item>
        <item>@drawable/balloon_random_02</item>
        <item>@drawable/dog_03</item>
    </integer-array>

</resources>

Тогда в своей деятельности обращайтесь к ним так:

TypedArray imgs = getResources().obtainTypedArray(R.array.random_imgs);

// get resource ID by index
imgs.getResourceId(i, -1)

// or set you ImageView's resource to the id
mImgView1.setImageResource(imgs.getResourceId(i, -1));

// recycle the array
imgs.recycle();
30 голосов
/ 28 сентября 2015

В папке value создайте xml имя файла, arrays.xml добавьте к нему данные следующим образом

<integer-array name="your_array_name">
    <item>@drawable/1</item>
    <item>@drawable/2</item>
    <item>@drawable/3</item>
    <item>@drawable/4</item>
</integer-array>

Затем получите его в свой код следующим образом

private TypedArray img;
img = getResources().obtainTypedArray(R.array.your_array_name);

Затем, чтобы использовать Drawable из них в img TypedArray, например, как ImageView background, используйте следующий код

ImageView.setBackgroundResource(img.getResourceId(index, defaultValue));

, где index - это Drawable индекс.defaultValue - это значение, которое вы указываете, если в этом элементе нет элемента index

Для получения дополнительной информации о TypedArray перейдите по этой ссылке http://developer.android.com/reference/android/content/res/TypedArray.html

14 голосов
/ 07 июля 2015

Вы можете использовать это для создания массива других ресурсов, таких как drawables.Обратите внимание, что массив не обязательно должен быть однородным, поэтому вы можете создать массив смешанных типов ресурсов, но вы должны знать, что и где типы данных находятся в массиве.

 <?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="icons">
        <item>@drawable/home</item>
        <item>@drawable/settings</item>
        <item>@drawable/logout</item>
    </array>
    <array name="colors">
        <item>#FFFF0000</item>
        <item>#FF00FF00</item>
        <item>#FF0000FF</item>
    </array>
</resources>

И получитьресурсы в вашей деятельности, как это

Resources res = getResources();
TypedArray icons = res.obtainTypedArray(R.array.icons);
Drawable drawable = icons.getDrawable(0);

TypedArray colors = res.obtainTypedArray(R.array.colors);
int color = colors.getColor(0,0);

Наслаждайтесь !!!!!

0 голосов
/ 21 июня 2019

Котлин может быть таким:

fun Int.resDrawableArray(context: Context, index: Int, block: (drawableResId: Int) -> Unit) {
  val array = context.resources.obtainTypedArray(this)
  block(array.getResourceId(index, -1))
  array.recycle()
}

R.array.random_imgs.resDrawableArray(context, 0) {
  mImgView1.setImageResource(it)
}
0 голосов
/ 04 августа 2011

Насколько я знаю, вы не можете хранить массивы в R.drawable.

Что вы можете сделать, это создать массив в config.xml или strings.xml, который отображает путь к рисуемому ресурсу с помощьюиспользуя псевдоним .

Проверьте, работает ли это, и, пожалуйста, дайте мне знать, если вам нужна дополнительная помощь.

...