以编程方式访问res / raw的内容(Android)

时间:2010-05-10 14:47:24

标签: java android

我正在与其他一些人一起开发Android应用程序,主要内容由我们的设计人员指定为特定文件格式的文本文件,然后我们在应用程序中解析,处理和提供。我们目前将它们存储在res/raw

这对设计师来说非常有用,因为当他们想要添加内容时,他们只需将文件添加到res/raw。然而,作为开发人员,这很烦人,因为我们的开发人员需要在代码中的数组中添加R.raw.the_new_file,指定在启动时要处理哪些文件。

有没有办法以编程方式访问res/raw的资源ID?理想情况下,当应用程序启动时,我们可以调用以查看res/raw中的哪些文件,处理所有这些文件,这样我们就可以通过将res/raw的内容与我们的内容进行匹配来消除小的开销。代码中的数组。

我见过的最有希望的路径是来自getAssetsResources,我可以在list(String)上拨打AssetManager,但我遇到了这个问题。工作,特别是因为你不能直接调用"res/raw"作为你的文件路径(或者至少,当我尝试时它没有工作。

3 个答案:

答案 0 :(得分:17)

你可以使用反射。


ArrayList<Integer> list = new ArrayList<Integer>();
Field[] fields = R.raw.class.getFields();
for(Field f : fields)
try {
        list.add(f.getInt(null));
    } catch (IllegalArgumentException e) {
    } catch (IllegalAccessException e) { }

在该列表中保存res / raw文件夹中的所有资源ID。 如果您需要资源的名称... f.getName()将返回它。

答案 1 :(得分:6)

这个答案可能有点迟,你应该使用assets文件夹。在那里,您可以拥有文件夹层次结构并将其作为文件系统读取。

对于您的信息,getAssets会返回Android项目“assets”文件夹中文件的管理员,而不是“res / raw”。 “res / raw”进入“R”Java包。 assets.list(path)返回给定文件夹中相对于assets文件夹的文件数组。资产的文件夹也不是传统的文件夹,但Android将其抽象化,使其“感觉”像普通文件一样。如果您正在进行JNI并希望从c / c ++中读取资产,这就变得更加重要。

答案 2 :(得分:1)

您可以使用

Context.getResources().getIdentifier("filename", "raw", "packagename");

获取适当的标识符。但是我不明白为什么你实施的解决方案很复杂?设计师有哪些优势?为什么他们不只是将文件放在drawable文件夹中?