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


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

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


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ę!!!!!


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

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

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


4
Down zagłosował za niezrozumieniem pytania - obawiam się, że nie ma przedawnienia ...
Charlie Scott-Skinner
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.