Хранение идентификаторов R.drawable в массиве XML

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

Любые идеи о том, как достичь этого?

Ответ 1

Вы используете типизированный массив в файле 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 resource to the id
mImgView1.setImageResource(imgs.getResourceId(i, -1));

// recycle the array
imgs.recycle();

Ответ 2

В папке 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

Ответ 3

Вы можете использовать это для создания массива других ресурсов, таких как 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);

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

Ответ 4

Кстати, может быть так:

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)
}

Ответ 5

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

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

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