我正在开发一个android库项目,它应该从原始资源中的xml文件读取(让我们称之为xml_file_name.myextension)。
我所做的基本上是创建一个包含这些文件夹的库项目的jar文件:
并将其作为测试应用中的库引用。这是我使用的代码(在库项目中)以获取xml文件:
int xml_res_id = -1;
for (Field f : R.raw.class.getFields()) {
System.out.println("Raw resource found: " + f.getName());
if (f.getName().equalsIgnoreCase("xml_file_name"))
xml_res_id = f.getInt(null);
}
if(xml_res_id != -1){
System.out.println("xml_file_id: " + xml_res_id);
InputStream is = context.getResources().openRawResource(xml_res_id);
// Decode xml file with SAXParser..
}
(我有应用程序上下文,因为应用程序显式将其传递给库项目。)
当我启动测试应用程序(并调用读取xml文件的方法)时会发生以下错误:
似乎xml文件实际上在正确的文件夹中,因为:
1)for循环实际打印“找到原始资源:xml_file_name.myextension”和“xml_file_id:2130968576”
2)如果我将一个名为“xml_file_name.myextension”的文件放在应用程序的res / raw文件夹中,它就不会编译,错误是:“生成最终存档时出错:找到APK的重复文件:res /生/ xml_file_name.myextension”。这基本上给了我证明 文件已从库项目中正确“导入”。
请注意: 我也试过这种方式
InputStream is = context.getResources().openRawResource(R.raw.xml_file_name);
得到同样的错误。
老实说,我不明白可能是什么问题。我做错了什么?
任何对此问题感兴趣的人: 我终于意识到这是不可能的,主要是因为当我尝试通过context.anymethod获取资源时我引用了应用程序的R文件,所以我无法从我的库项目的R文件中获取资源ID 。
它将编译,因为库项目jar文件包含资源(R.raw.xml_file),但是对context.something的调用将始终为null,因为它引用了应用程序R文件,而不是拥有该特定资源。
我最终不得不将我的xml文件放在应用程序的res / raw文件夹中,并以这种方式访问xml_file原始资源:
int xml_id = context.getResources().getIdentifier("xml_file_name", "raw", context.getPackageName());
// Getting input stream from xml file
InputStream is = context.getResources().openRawResource(xml_id);
答案 0 :(得分:0)
我实际上已成功完成此操作 - 库对象应位于应用程序上下文中。但是,它仅适用于Activity
,而不是我找到的其他类型。使用FragmentActivity
的同一个库会因NoClassDefFoundError
而失败。
修改**** 强>
它可以在与库相同的根命名空间内与FragmentActivity一起使用。我从不同的根命名空间访问。
END EDIT ****
我有一个引用xml文件的库项目:
InputStream is = context.getResources().openRawResource(R.raw.application_table_defs);
当我调用执行上一行的库方法时,我必须在上下文中传递:
Context context = this.getContext();
关键是完全符合注入的getResource
到context.getResources()...
。