用变量加载资源?

时间:2011-04-11 18:58:05

标签: android android-resources

我正在加载像这样的XML文件资源,

getResources().getXml(R.xml.fiel1); 

现在,情况是根据因素,可能有许多xml文件可供选择。我怎么做? 在这种情况下,文件名类似于以下事实:所有以文件开头只以不同的数字结尾 file1,file2,file3等,所以我可以用文件名形成一个String变量,并根据需要添加一个后缀,形成一个像file1(file + 1)这样的文件名。 问题是我不断尝试将文件名变量传递给方法时遇到各种错误(NullPointerEx,ResourceId Not found等)。 完成此任务的正确方法是什么?

3 个答案:

答案 0 :(得分:5)

你可以使用getIdentifier(),但文档提到:

  

不鼓励使用此功能。   检索效率更高   标识符而非名称的资源。

因此最好使用引用xml文件的数组。您可以将其声明为integer array resource。例如,在res/values/arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer-array name="xml_files">
        <item>@xml/file1</item>
        <item>@xml/file2</item>
        etc...
    </integer-array>
</resources>

然后在Java中:

private XmlResourceParser getXmlByIndex(int index) {
    Resources res = getResources();
    return res.getXml(res.getIntArray(R.array.xml_files)[index - 1]);
}

当然,每当添加新的xml文件时,您都需要更新数组。

答案 1 :(得分:3)

您可以使用资源的getIdentifier方法查找ID。

Resources res = getResources();
for(/* loop */) {
    int id = res.getIdentifier("file" + i, "xml", "my.package.name");
    res.getXml(id);
}

答案 2 :(得分:2)

假设资源数量在编译时是固定的,getIdentifier建议的替代方法是在标识符和资源之间创建静态映射。

因此,例如,您可以使用后缀数字ID:

class Whatever {
    static final int[] resources = new int[] {
        R.xml.file1, R.xml.file2, R.xml.file3
    }
}

这将允许您使用简单的索引操作检索资源。

getResources().getXml(resources[i]);

或者,如果您需要更具描述性的映射,则可以使用基于java Map的任何一种类。

class Whatever {
    static final Map<String, Integer> resources = new HashMap<String, Integer>();

    static {
        resources.put("file1", R.xml.file1);
        resources.put("file2", R.xml.file2);
        resources.put("file3", R.xml.file3);
        resources.put("something_else", R.xml.something_else);
    }
}

通过这个,您可以get(String)按名称列出值。