android - 在 Android 中声明维度、颜色、资源 ID 或其他非标准数据类型的数组?

标签 android xml android-resources typed-arrays

我发现自己希望创建 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/

相关文章:

python - 序列化程序不从查询集中写入单个对象

android - 资源不是 Drawable Resources$NotFoundException

Java.lang.IllegalStateException : Already attached

android - 将参数传递给 Asynctask

java - Android TextWather 对象。 java 匿名类是如何工作的?

android - 有没有办法一次运行多个 IntentService?

java - 如何在 Java 中创建 XML 属性文件?

xml - 尽管正在同步项目,但无法在 Android Studio 中解析符号 'Theme'

android - 无法解析资源 @style/Widget.Holo.Light.ActionMode.Inverse

特定产品的 Android 资源