Lưu trữ ID R.drawable trong mảng XML


146

Tôi muốn lưu trữ ID tài nguyên có thể rút được ở dạng R.drawable.*bên trong một mảng bằng cách sử dụng tệp giá trị XML và sau đó truy xuất mảng trong hoạt động của tôi.

Bất kỳ ý tưởng làm thế nào để đạt được điều này?


1
Bạn có thể làm rõ ý của bạn bằng cách "bên trong một mảng bằng XML" không?
Eugene S

một tập tin giá trị. ví dụ:
String.xml

1
Tôi không hiểu tại sao bạn muốn làm điều này. Bạn có thể cung cấp thêm một chút nền tảng về lý do tại sao bạn muốn làm theo cách này?
mattr-

Âm thanh như bạn đang cố gắng làm một cái gì đó phức tạp hơn mức cần thiết.
Octavian A. Damiean

3
Những gì tôi đang cố gắng làm là lưu trữ id cho các hình ảnh sẽ được hiển thị trong một listview.
gammaraptor

Câu trả lời:


362

Bạn sử dụng một mảng được gõ trong arrays.xmltệp trong /res/valuesthư mục của bạn trông như thế này:

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

Sau đó, trong hoạt động của bạn, truy cập chúng như vậy:

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
Cảm ơn rât nhiều. Tôi đã điều chỉnh mã, và bây giờ nó hoạt động. Cảm ơn rât nhiều.
gammaraptor

6
Này, bạn có thể giải thích -1 trong imss.getResourceId (i, -1) là gì không?
Nishad

6
Khuyến nghị: Sau khi người dùng "nhập" thêm dòng sau: imss.recycle ();
benoffi7

9
Bạn nên sử dụng 0 thay vì -1 cho id mặc định. -1 là id tài nguyên hợp lệ, trong khi 0 là tài nguyên null.
Alex

6
tuyệt diệu! đánh máy mảng là ngọt ngào.
vào

31

Trong valuethư mục tạo xmltên tệp, nó arrays.xml thêm dữ liệu vào nó theo cách này

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

Sau đó, lấy mã của bạn theo cách này

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

Sau đó, để sử dụng một Drawabletrong số này trong img TypedArrayví dụ như ImageView backgroundsử dụng mã sau đây

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

nơi indexDrawablechỉ mục. defaultValuelà một giá trị bạn đưa ra nếu không có mục nàyindex

Để biết thêm thông tin về việc TypedArraytruy cập liên kết này http://developer.android.com/reference/android/content/res/TypedArray.html


15

Bạn có thể sử dụng điều này để tạo ra một loạt các tài nguyên khác, chẳng hạn như drawables. Lưu ý rằng mảng không bắt buộc phải đồng nhất, vì vậy bạn có thể tạo một mảng các loại tài nguyên hỗn hợp, nhưng bạn phải nhận thức được những gì và nơi các loại dữ liệu trong mảng.

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

Và có được các tài nguyên trong hoạt động của bạn như thế này

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

Thưởng thức!!!!!


1

cách kotlin có thể là thế này:

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

Trong Kotlin, bạn có thể làm như sau: -

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

Bạn sẽ nhận được mảng hình ảnh từ tài nguyên như TypedArray

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

lấy ID tài nguyên theo chỉ mục

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

HOẶC bạn có thể đặt tài nguyên của imageView thành id

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

và cuối cùng tái chế mảng

imageArray.recycle()

-2

Bạn không thể lưu trữ các mảng trong R.drawable theo như tôi biết.

Những gì bạn có thể làm là tạo một mảng trong config.xml hoặc String.xml để ánh xạ đường dẫn đến tài nguyên có thể vẽ bằng cách sử dụng tài nguyên bí danh .

Xem nếu điều này hoạt động, và xin vui lòng cho tôi biết nếu bạn cần thêm trợ giúp.


4
Tôi đã bỏ phiếu vì đã hiểu nhầm câu hỏi - không có thời hiệu nào về điều này Tôi sợ ...
Charlie Scott-Skinner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.