0

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

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

现在的情况是,根据不同的因素,可能有许多 xml 文件可供选择。我怎么做?在这种情况下,文件名是相似的,因为所有文件都以文件开头,只以不同的数字结尾,如文件 1、文件 2、文件 3 等,所以我可以只用文件名形成一个字符串变量,并根据要求添加一个后缀来形成像 file1 (file+1) 这样的文件名。问题是我不断收到各种错误(NullPointerEx、ResourceId Not found 等),无论我以何种方式尝试将文件名变量传递给方法。完成此操作的正确方法是什么?

4

3 回答 3

5

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

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

所以最好使用引用 xml 文件的数组。您可以将其声明为整数数组资源。例如,在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 文件,都需要更新数组。

于 2011-04-11T19:43:41.350 回答
3

您可以使用 Resources 的getIdentifier方法来查找 id。

Resources res = getResources();
for(/* loop */) {
    int id = res.getIdentifier("file" + i, "xml", "my.package.name");
    res.getXml(id);
}
于 2011-04-11T19:11:01.160 回答
2

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

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

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

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

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

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

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)通过它的名字来取值。

于 2011-04-11T19:51:19.467 回答