我发现自己希望创建 Android 本身似乎不支持的值的 xml 数组,并且正在寻找解决该问题的方法。
目前,如果您希望在 XML 中声明一个值数组,您只能使用字符串、整数和一个通用的无类型“数组”,但我真正想要的是能够拥有引用 ID 的数组颜色、尺寸等。类似于以下内容:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<array name="sizes">
<item>@dimen/someSize1</item>
<item>@dimen/someSize2</item>
<item>@dimen/someSize3</item>
</array>
<array name="colors">
<item>@color/red</item>
<item>@color/green</item>
<item>@color/blue</item>
</array>
</resources>
或者作为一个延伸目标,能够声明原始维度/颜色,而不仅仅是引用。
不幸的是,我似乎找不到真正做到这一点的好方法。我可以访问数组
Resources resources = context.getResources();
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.MyClass, defStyle, 0);
int sizesid = array.getResourceId(R.styleable.MyClass_sizes, defaultId);
int colorsid = array.getResourceId(R.styleable.MyClass_colors, defaultId);
这都是有效的,当我像这样使用这些 id 检索数组时,我得到了实际有效的 int 数组
int[] colorIds = resources.getIntArray(colorsid);
问题是如果我想解析实际的颜色或尺寸,这些整数不能用作有效的引用 ID。
resources.getColor(colorIds[0]); // Throws Resource NotFoundException
有什么方法可以将 int 转换为实际有效的资源 ID 引用吗?我认为这就是资源具有单独的 getDimension/getInteger/getIdentifier 的原因。
编辑:这里的目标是从我在适当的 attrs.xml 中定义的自定义 xmlns 参数引用这些数组,以便它们可以包含在 xml 布局文件中,如下所示:
<com.example.MyClass
xmlns:custom="http://schemas.android.com/apk/res-auto"
custom:sizes="@array/sizes"
custom:colors="@array/colors" />
这就是为什么我的示例使用 context.obtainStyledAttributes 来获取 TypedArray 对象,以及为什么我使用 R.styleable.foo 资源来访问它的值。我发现字符串数组工作得很好。问题是这些引用 ID 数组(或复杂颜色/维度数组),并且当我访问它们时它们似乎不包含有意义的值。
最佳答案
我 100% 肯定您可以完全按照您已经尝试过的方式进行操作。我知道这一点,因为我以前用过它们。更具体地说,字符串 ID 数组。但是,问题在于您何时尝试检索它们。将其保留为 TypedArray
,并使用 .getResourceId
,传入索引和默认 ID,以防出现问题。
我使用的是适配器中的 getString(mTypedArray.getResourceId(position, 0))
。您正在做的是在查找 INDEX 时传递一个 ID(错误)。
编辑:为了进一步说明,当我检索我的 TypedArray 时,我是这样做的:
getResources().obtainTypedArray(R.array.name_of_array)
关于android - 在 Android 中声明维度、颜色、资源 ID 或其他非标准数据类型的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22751042/