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


146

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

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


1
Можете ли вы уточнить, что вы подразумеваете под «внутри массива с использованием XML»?
Евгений С

файл значений. например,
strings.xml

1
Я не понимаю, почему вы хотели бы сделать это. Не могли бы вы рассказать о том, почему вы хотите сделать это таким образом?
Mattr-

Похоже, вы пытаетесь сделать что-то более сложное, чем необходимо.
Октавиан А. Дамиан

3
Я пытаюсь сохранить идентификатор изображений, которые будут отображаться в виде списка.
гаммараптор

Ответы:


362

Вы используете типизированный массив в 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();

1
Большое спасибо. Я адаптировал код, и теперь он работает. Большое спасибо.
гаммараптор

6
Эй, вы можете объяснить, что означает -1 в imgs.getResourceId (i, -1)?
Нишад

6
Рекомендация: после того, как пользователь "imgs" добавит следующую строку: imgs.recycle ();
benoffi7

9
Вы должны использовать 0 вместо -1 в качестве идентификатора по умолчанию. -1 - действительный идентификатор ресурса, а 0 - нулевой ресурс.
Алекс

6
фантастика! типизированные массивы сладкие.
просит

31

В 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


15

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

Наслаждаться!!!!!


1

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

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

1

В Котлине вы можете сделать так:

 <integer-array name="drawer_icons">
    <item>@drawable/drawer_home</item>
</integer-array>

Вы получите массив изображений из ресурса как TypedArray

 val imageArray = resources.obtainTypedArray(R.array.drawer_icons)

получить идентификатор ресурса по индексу

imageArray.getResourceId(imageArray.getIndex(0),-1)

ИЛИ вы можете установить ресурс imageView для идентификатора

imageView.setImageResource(imageArray.getResourceId(imageArray.getIndex(0),-1))

и в последнем перерабатывать массив

imageArray.recycle()

-2

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

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

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


4
Даун проголосовал за неправильное понимание вопроса - я боюсь, что нет срока давности по этому вопросу ...
Чарли Скотт-Скиннер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.