我正在与其他一些人一起开发Android应用程序,主要内容由我们的设计人员指定为特定文件格式的文本文件,然后我们在应用程序中解析,处理和提供。我们目前将它们存储在res/raw
。
这对设计师来说非常有用,因为当他们想要添加内容时,他们只需将文件添加到res/raw
。然而,作为开发人员,这很烦人,因为我们的开发人员需要在代码中的数组中添加R.raw.the_new_file
,指定在启动时要处理哪些文件。
有没有办法以编程方式访问res/raw
的资源ID?理想情况下,当应用程序启动时,我们可以调用以查看res/raw
中的哪些文件,处理所有这些文件,这样我们就可以通过将res/raw
的内容与我们的内容进行匹配来消除小的开销。代码中的数组。
我见过的最有希望的路径是来自getAssets
的Resources,我可以在list(String)
上拨打AssetManager,但我遇到了这个问题。工作,特别是因为你不能直接调用"res/raw"
作为你的文件路径(或者至少,当我尝试时它没有工作。
答案 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文件夹中?