Збереження ідентифікаторів R.dravable ID у масиві XML


146

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

Будь-які ідеї, як цього досягти?


1
Чи можете ви уточнити, що ви маєте на увазі під «масивом масиву за допомогою XML»?
Євген S

файл значень. наприклад, strings.xml
gammaraptor

1
Я не розумію, чому ви хочете це зробити. Чи можете ви надати трохи більше інформації про те, чому ви хочете зробити це саме так?
маттр-

Схоже, ви намагаєтесь зробити щось набагато складніше, ніж потрібно.
Октавіан А. Дамієн

3
Що я намагаюся зробити - це зберегти ідентифікатор для зображень, які будуть відображатися в перегляді списку.
gammaraptor

Відповіді:


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

Ви можете використовувати це для створення масиву інших ресурсів, таких як траси. Зауважте, що масив не повинен бути однорідним, тому ви можете створювати масив змішаних типів ресурсів, але ви повинні знати про те, що і де є типи даних у масиві.

 <?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.