使用变量加载资源?

发布于 2024-10-31 18:52:14 字数 333 浏览 1 评论 0原文

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

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

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

I am loading XML file resource like this,

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

Now, the scenario is that depending on factors there may be many xml files to choose from. How do I do that?
In this case the filename is similar in the fact that all starts with file only ends with different numbers like
file1, file2,file3 etc., So I can just form a String variable with the file name and add a suffix as per requirement to form a filename like file1 (file+1).
Problem is I keep getting various errors (NullPointerEx, ResourceId Not found etc) in whatever way I try to pass the filename variable to the method.
What is the correct way of accomplishing this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

半岛未凉 2024-11-07 18:52:14

您可以使用 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 文件时,您都需要更新数组。

You could use getIdentifier() but the docs mention:

use of this function is discouraged.
It is much more efficient to retrieve
resources by identifier than by name.

So it's better to use an array which references the xml files. You can declare it as an integer array resource. Eg, in 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>

And then in Java:

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

Of course, you'll need to update the array whenever you add a new xml file.

预谋 2024-11-07 18:52:14

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

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

You can use the getIdentifier method of Resources to find the id.

Resources res = getResources();
for(/* loop */) {
    int id = res.getIdentifier("file" + i, "xml", "my.package.name");
    res.getXml(id);
}
猫烠⑼条掵仅有一顆心 2024-11-07 18:52:14

假设资源数量在编译时是固定的,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)该值。

An alternative to the getIdentifier suggestions, assuming the number of resources is fixed at compile time, would be to create a static mapping between an identifier and the resource.

So for example you could use the suffixed numerical ID:

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

This would allow you retrieve the resource with a simple index operation.

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

Alternatively, if you needed a more descriptive mapping you can use any one of java's Map-based classes.

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

With this you would then get(String) the value by its name.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文