2

我正在开发一个 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)如果我在应用程序的res/raw文件夹中放了一个名为“xml_file_name.myextension”的文件,它不会编译,并且错误是:“Error generate final archive: Found duplicate file for APK: res/raw/xml_file_name .myextension”。这基本上证明了该文件是从库项目中正确“导入”的。

请注意:我也尝试过这种其他方式

InputStream is = context.getResources().openRawResource(R.raw.xml_file_name);

得到同样的错误。

老实说,我不明白可能是什么问题..我做错了什么?


编辑:

对于任何对此问题感兴趣的人:我终于意识到这是不可能的,主要是因为当我尝试通过 context.anymethod 获取资源时,我指的是应用程序的 R 文件,所以我无法给出从中获取的资源 ID我的库项目的 R 文件。

它将编译,因为库项目 jar 文件包含资源(R.raw.xml_file),但对 context.something 的调用将始终给出 null 作为结果,因为它引用了没有那个特定的 app 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);
4

1 回答 1

0

我实际上已经成功地做到了 - 库对象应该在应用程序上下文中。但是,它仅适用于Activity我发现的其他类型。使用带有 a 的相同库FragmentActivity失败,带有NoClassDefFoundError.

编辑****

它可以在与库相同的根命名空间中与 FragmentActivity 一起使用。我正在从不同的根名称空间访问。

结束编辑****

我有一个引用 xml 文件的库项目:

InputStream is = context.getResources().openRawResource(R.raw.application_table_defs);

当我调用执行上一行的库方法时,我必须传入一个上下文:

Context context = this.getContext();

关键是完全限定注入的getResourceto context.getResources()...

于 2014-09-23T15:40:44.740 回答