Menyimpan R.drawable ID dalam array XML

146

Saya ingin menyimpan ID sumber daya yang dapat digambar dalam bentuk R.drawable.*di dalam array menggunakan file nilai XML, dan kemudian mengambil array dalam aktivitas saya.

Adakah ide bagaimana mencapai ini?

gammaraptor
sumber
1
Bisakah Anda mengklarifikasi apa yang Anda maksud dengan "di dalam array menggunakan XML"?
Eugene S
file nilai. misalnya, strings.xml
gammaraptor
1
Saya tidak mengerti mengapa Anda ingin melakukan ini. Bisakah Anda memberikan sedikit latar belakang tentang mengapa Anda ingin melakukannya dengan cara ini?
mattr-
Sepertinya Anda mencoba melakukan sesuatu yang jauh lebih rumit daripada yang diperlukan.
Octavian A. Damiean
3
Apa yang saya coba lakukan adalah untuk menyimpan id untuk gambar yang akan ditampilkan dalam tampilan daftar.
gammaraptor

Jawaban:

362

Anda menggunakan array yang diketik dalam arrays.xmlfile di dalam /res/valuesfolder Anda yang terlihat seperti ini:

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

Kemudian dalam aktivitas Anda, akses mereka seperti ini:

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
sumber
1
Terima kasih banyak. Saya mengadaptasi kode, dan sekarang berfungsi. Terima kasih banyak.
gammaraptor
6
Hei, bisakah Anda menjelaskan apa arti -1 di imgs.getResourceId (i, -1)?
Nishad
6
Rekomendasi: Setelah pengguna "imgs" tambahkan baris berikut: imgs.recycle ();
benoffi7
9
Anda harus menggunakan 0 bukannya -1 untuk id default. -1 adalah id sumber daya yang valid, sedangkan 0 adalah sumber daya nol.
Alex
6
fantastis! array yang diketiknya manis.
asgs
31

Dalam valuefolder buat xmlnama file itu arrays.xml menambahkan data ke dalamnya dengan cara ini

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

Kemudian dapatkan ke kode Anda dengan cara ini

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

Kemudian untuk menggunakan salah satu Drawabledari ini img TypedArraymisalnya sebagai ImageView backgroundgunakan kode berikut

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

di mana indexadalah Drawableindeks. defaultValueadalah nilai yang Anda berikan jika tidak ada item dalam hal iniindex

Untuk informasi lebih lanjut tentang TypedArraykunjungi tautan ini http://developer.android.com/reference/android/content/res/TypedArray.html

Ahmed Mostafa
sumber
15

Anda dapat menggunakan ini untuk membuat array sumber daya lain, seperti drawables. Perhatikan bahwa array tidak harus homogen, sehingga Anda bisa membuat array tipe sumber daya campuran, tetapi Anda harus mengetahui apa dan di mana tipe data dalam array.

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

Dan dapatkan sumber daya dalam aktivitas Anda seperti ini

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

Nikmati!!!!!

poudel yubaraj
sumber
1

Cara kotlin bisa seperti ini:

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
sumber
1

Di Kotlin, Anda dapat melakukan sebagai: -

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

Anda akan mendapatkan berbagai Gambar dari sumber sebagai TypedArray

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

dapatkan ID sumber daya dengan indeks

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

ATAU Anda dapat mengatur sumber daya imageView ke id

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

dan terakhir mendaur ulang array

imageArray.recycle()
Alok Mishra
sumber
-2

Anda tidak dapat menyimpan array di R.drawable sejauh yang saya tahu.

Yang bisa Anda lakukan adalah membuat array di config.xml atau strings.xml yang memetakan jalur ke sumber daya yang dapat digambar dengan menggunakan sumber daya alias .

Lihat apakah ini berfungsi, dan beri tahu saya jika Anda memerlukan bantuan tambahan.

Codeman
sumber
4
Down memilih untuk salah paham pertanyaan - tidak ada undang-undang pembatasan tentang ini saya khawatir ...
Charlie Scott-Skinner