Przechowywanie identyfikatorów R.drawable w tablicy XML

146

Chciałbym przechowywać identyfikator zasobów do rysowania w postaci R.drawable.*wewnątrz tablicy przy użyciu pliku wartości XML, a następnie pobrać tablicę w mojej aktywności.

Jakieś pomysły, jak to osiągnąć?

gammaraptor
źródło
1
Czy możesz wyjaśnić, co masz na myśli, mówiąc „wewnątrz tablicy przy użyciu XML”?
Eugene S
plik wartości. np.
strings.xml
1
Nie rozumiem, dlaczego chcesz to zrobić. Czy możesz podać więcej informacji na temat tego, dlaczego chcesz to zrobić w ten sposób?
mattr-
Wygląda na to, że próbujesz zrobić coś bardziej skomplikowanego niż to konieczne.
Octavian A. Damiean
3
To, co próbuję zrobić, to zapisać identyfikator obrazów, które będą wyświetlane w widoku listy.
gammaraptor

Odpowiedzi:

362

Używasz wpisanej tablicy w arrays.xmlpliku w swoim /res/valuesfolderze, która wygląda następująco:

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

Następnie w swojej aktywności uzyskaj do nich dostęp w następujący sposób:

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();
Patrick Kafka
źródło
1
Dziękuję Ci bardzo. Dostosowałem kod i teraz działa. Dziękuję Ci bardzo.
gammaraptor
6
Hej, czy możesz wyjaśnić, co oznacza -1 w imgs.getResourceId (i, -1)?
Nishad
6
Zalecenie: po "imgs" użytkownika dodaj następujący wiersz: imgs.recycle ();
benoffi7
9
Jako domyślny identyfikator powinieneś używać 0 zamiast -1. -1 to poprawny identyfikator zasobu, a 0 to pusty zasób.
Alex
6
fantastyczny! typowane tablice są słodkie.
asgs
31

W valuefolderze utwórz xmlnazwę pliku arrays.xml w ten sposób dodaje do niego dane

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

Następnie uzyskaj go do swojego kodu w ten sposób

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

Następnie, aby użyć Drawablez nich img TypedArrayna przykład jako ImageView backgroundużyj następującego kodu

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

gdzie indexjest Drawableindeks. defaultValueto wartość, którą podajesz, jeśli nie ma w tym pozycjiindex

Aby uzyskać więcej informacji na temat, TypedArrayodwiedź ten link http://developer.android.com/reference/android/content/res/TypedArray.html

Ahmed Mostafa
źródło
15

Możesz użyć tego do stworzenia szeregu innych zasobów, takich jak przedmioty do rysowania. Zauważ, że tablica nie musi być jednorodna, więc możesz utworzyć tablicę mieszanych typów zasobów, ale musisz wiedzieć, jakie i gdzie typy danych znajdują się w tablicy.

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

I zdobądź zasoby w swojej działalności w ten sposób

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

Cieszyć się!!!!!

yubaraj poudel
źródło
1

sposób kotlin mógłby być taki:

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)
}
Jan Rabe
źródło
1

W Kotlinie możesz: -

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

Otrzymasz tablicę Image z zasobu jako TypedArray

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

pobierz identyfikator zasobu przez indeks

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

LUB możesz ustawić zasób imageView na id

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

i na koniec ponownie przetworzyć tablicę

imageArray.recycle()
Alok Mishra
źródło
-2

O ile wiem, nie możesz przechowywać tablic w R.drawable.

To, co możesz zrobić, to utworzyć tablicę w config.xml lub strings.xml, która odwzorowuje ścieżkę do zasobu do rysowania przy użyciu zasobu aliasu .

Sprawdź, czy to zadziała, i daj mi znać, jeśli potrzebujesz dodatkowej pomocy.

Codeman
źródło
4
Down zagłosował za niezrozumieniem pytania - obawiam się, że nie ma przedawnienia ...
Charlie Scott-Skinner