android从库项目导入资源

时间:2011-01-19 22:24:38

标签: android xml resources android-library

是否可以使用在应用程序项目中的库项目中定义的字符串等资源?如果是这样,怎么样? 因为我似乎无法解决我想解决的字符串:

String title = "sample";
int id = ressources.getIdentifier(title, "string", "com.package");

给了我这个例外

WARN / ResourceType(278):获取资源号0x00000000的值时没有包标识符 WARN / System.err(278):android.content.res.Resources $ NotFoundException:字符串资源ID#0x0

我正在寻找的字符串(“sample”)肯定是在这个包中提供的库项目的strings.xml中。我甚至可以在R.java中看到它

4 个答案:

答案 0 :(得分:14)

所以它看起来像

  

int id = ressources.getIdentifier(title,“string”,“com.package”);

正在返回0,这意味着它无法找到指定的资源。随后对ressources.getIdentifer()的调用会导致异常,因为0不是有效的资源ID。

以下是一些调试/替代想法:


  • 你可能已经做了十几次了,但这并没有让人觉得:首先要重新检查所有内容的拼写:

    • 包拼写正确(在库项目和客户端项目中),
    • 资源字符串正确(库项目和客户端项目),
    • uses-library元素AndroidManifest.xml
    • 中的库拼写正确

  • 您是否可以访问该库中的任何资源,或者是该资源特有的问题(title)还是特定于该类型的资源(字符串)?你能访问另一个图书馆的资源吗?

  • 您是否以jar文件的形式访问该库?您可以对代码进行操作,但无法从jar访问资源。

Android - Is it possible to create a custom library to use across several applications?


  • 您是否尝试过备用名称格式:

代码

String fullyQualifiedResourceName = "com.package:string/sample";
int id = ressources.getIdentifier(title, null, null);
if (id == 0) {
    Log.e(TAG, "Lookup id for resource '"+fullyQualifiedResourceName+"' failed";
    // graceful error handling code here
}

  • 您可以尝试使用反射:

代码

final String resourceName= "sample";
final int id;
try {
    final Class resourceType = com.package.R.string.class;
    final Field field = resourceType.getField(title);
    id = field.getInt(null);
} catch (final Exception e) {
    Log.e(TAG, "Lookup id for resource '"+resourceName+"' failed";
    // graceful error handling code here
}

Android, getting resource ID from string?

http://daniel-codes.blogspot.com/2009/12/dynamically-retrieving-resources-in.html

答案 1 :(得分:3)

在项目代码中,导入R类:

import com.application.libraryproject.R

然后你可以像这样引用任何字符串或其他xml定义的资源:

String mystring = getString(R.string.app_name);

或类似。

答案 2 :(得分:2)

我遇到了类似的问题,我使用项目库中的getPackageName()方法解决了这个问题。

在你的情况下,它应该是:

String title = "sample";
int id = ressources.getIdentifier(title, "string", getPackageName());

答案 3 :(得分:0)

是的,像正常一样定义库项目中的资源。然后在导入库的项目中引用它们,方法是在库的AndroidManifest.xml中使用包名称前面加上R类。