การจัดเก็บ R.drawable IDs ในอาร์เรย์ XML


146

ฉันต้องการเก็บ ID ของทรัพยากร drawable ในรูปแบบของR.drawable.*อาร์เรย์ภายในโดยใช้ไฟล์ค่า XML แล้วดึงข้อมูลอาร์เรย์ในกิจกรรมของฉัน

ความคิดใด ๆ ของวิธีการบรรลุสิ่งนี้?


1
คุณสามารถอธิบายสิ่งที่คุณหมายถึงโดย "ในอาร์เรย์โดยใช้ XML"?
Eugene S

ไฟล์ค่า เช่น strings.xml
gammaraptor

1
ฉันไม่เข้าใจว่าทำไมคุณถึงต้องการทำเช่นนี้ คุณสามารถให้พื้นฐานเพิ่มเติมเกี่ยวกับสาเหตุที่คุณต้องการทำเช่นนี้ได้หรือไม่
mattr-

ดูเหมือนว่าคุณกำลังพยายามทำสิ่งที่ซับซ้อนกว่าที่จำเป็น
Octavian A. Damiean

3
สิ่งที่ฉันพยายามทำคือการจัดเก็บ id สำหรับภาพที่จะแสดงในรายการ
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
ขอบคุณมาก. ฉันดัดแปลงรหัสและตอนนี้ก็ใช้งานได้ ขอบคุณมาก.
gammaraptor

6
สวัสดีคุณสามารถอธิบายสิ่งที่ -1 ใน imgs.getResourceId (i, -1) ได้หรือไม่
Nishad

6
คำแนะนำ: หลังจากผู้ใช้ "imgs" เพิ่มบรรทัดต่อไปนี้: imgs.recycle ();
benoffi7

9
คุณควรใช้ 0 แทน -1 สำหรับรหัสเริ่มต้น -1 เป็นรหัสทรัพยากรที่ถูกต้องในขณะที่ 0 เป็นทรัพยากรที่ว่าง
Alex

6
! ที่ยอดเยี่ยม อาเรย์ที่พิมพ์ออกมานั้นน่ารัก
asgs

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

คุณสามารถใช้สิ่งนี้เพื่อสร้างอาร์เรย์ของทรัพยากรอื่น ๆ เช่น drawable โปรดทราบว่าอาเรย์ไม่จำเป็นต้องเป็นเนื้อเดียวกันดังนั้นคุณสามารถสร้างอาเรย์ของชนิดของทรัพยากรแบบผสมได้ แต่คุณต้องระวังสิ่งที่และชนิดของข้อมูลที่อยู่ในอาเรย์

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

วิธี kotlin อาจเป็นเช่นนี้:

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

ใน Kotlin คุณสามารถทำได้ดังนี้: -

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

คุณจะได้รับอาร์เรย์ของรูปภาพจากทรัพยากรเป็น TypedArray

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

รับ ID ทรัพยากรตามดัชนี

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

หรือคุณสามารถตั้งค่าทรัพยากรของ imageView เป็น id

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

และในที่สุดรีไซเคิลอาร์เรย์

imageArray.recycle()

-2

คุณไม่สามารถจัดเก็บอาร์เรย์ใน R.drawable เท่าที่ฉันรู้

สิ่งที่คุณสามารถทำได้คือการสร้างอาร์เรย์ใน config.xml หรือ strings.xml ที่แผนที่เส้นทางไปยังทรัพยากร drawable โดยใช้นักทรัพยากรนามแฝง

ดูว่ามันใช้งานได้และโปรดแจ้งให้เราทราบหากคุณต้องการความช่วยเหลือเพิ่มเติม


4
ลงคะแนนสำหรับความเข้าใจผิดคำถาม - มีข้อ จำกัด ไม่เกี่ยวกับเรื่องนี้ฉันกลัว ...
ชาร์ลีสกอตต์สกินเนอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.