在XML数组中存储R.drawable ID


146

我想R.drawable.*使用XML值文件以数组内部的形式存储可绘制资源的ID ,然后在我的活动中检索该数组。

关于如何实现这一目标的任何想法?


1
您能否澄清“使用XML在数组内部”的含义?
Eugene S

值文件。例如,strings.xml
gammaraptor 2011年

1
我不明白您为什么要这样做。您能否提供更多为什么要这样做的背景知识?
mattr- 2011年

听起来您正在尝试做一些比必要的复杂的事情。
2011年

3
我想做的是存储将在列表视图中显示的图像的ID。
gammaraptor

Answers:


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 2011年

6
嘿,您能解释imgs.getResourceId(i,-1)中的-1代表什么吗?
Nishad

6
建议:在用户“ imgs”之后添加以下行:imgs.recycle();
benoffi7'4

9
您应该使用0而不是-1作为默认ID。-1是有效的资源ID,而0是空资源。
亚历克斯

6
太棒了!类型数组很不错。
突袭2015年

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

其中indexDrawable索引。 defaultValue如果没有此项目,则为您提供的值index

有关更多信息,TypedArray请访问此链接 http://developer.android.com/reference/android/content/res/TypedArray.html


15

您可以使用它来创建其他资源的数组,例如可绘制对象。请注意,数组不需要是同质的,因此您可以创建混合资源类型的数组,但是必须知道数据类型以及数组中数据的位置。

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

科特林的方式可能是这样的:

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中创建一个数组,该数组通过使用别名资源将路径映射到可绘制资源

看看是否可行,如果您需要其他帮助,请告诉我。


4
出于对这个问题的误解而被否决了-恐怕对此没有法律限制...
Charlie Scott-Skinner
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.