从库项目导入资源到Android

16

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

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

我在库项目的strings.xml中提供了所需的字符串("sample"),并且甚至可以在R.java中看到它。


com.package是在你的库项目AndroidManifest.xml中定义的包名吗? - Nick Campion
是的,所有类都在这个包中。 - clamp
4个回答

14
看起来像是int id = ressources.getIdentifier(title, "string", "com.package")返回了0,意味着它无法找到指定的资源。后续对ressources.getIdentifier()的调用会导致异常,因为0不是有效的资源ID。
以下是一些调试/替代思路:
- 请再次检查每个拼写(库项目和客户端项目中的package拼写、资源字符串拼写、AndroidManifest.xmluses-library元素中的库拼写等); - 您是否可以访问该库中的任何资源,或者问题是否限于该资源(title)或该类型的资源(字符串)?您能否访问另一个库的资源? - 您是作为jar文件访问库吗?您可以将代码打包成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 资源 ID?

动态检索 Android 资源


1
感谢您详细的回答!我使用的库不是一个jar包,而只是另一个在Eclipse中的项目,我已经通过Android项目属性进行了引用。使用fullyQualifiedResourceName版本仍然会出现相同的错误。 - clamp
1
反射版本确实起作用了,但我仍然想知道为什么“官方”的版本没有起作用。 - clamp
@clamp - 我尝试跟踪源代码以获取线索,但代码很快进入本地代码,我更难以跟随那里面的内容。http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/content/res/Resources.java;hb=HEAD;http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/java/android/content/res/AssetManager.java;http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/jni/android_util_AssetManager.cpp - Bert F

3

在您的项目代码中导入R类:

import com.application.libraryproject.R

然后您可以通过以下方式引用任何字符串或其他xml定义的资源:

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

或类似的方式。


谢谢,实际上我的问题是错误的。我的问题实际上是要通过使用getIdentifier和它的名称来获取资源的ID。 - clamp

2

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

在你的情况下,应该是这样的:

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

0

是的,在库项目中像平常一样定义资源。然后在导入库的项目中,通过在库的 AndroidManifest.xml 中使用包名作为前缀来引用 R 类中的资源。


好的,但是如果我想要使用这个函数 getResources().getString(int id) 来获取字符串呢? - clamp
它与使用标准的R类完全相同,即getResources().getString(R.string.somestringyouwanttouse)。 - Nick Campion
谢谢,实际上我之前的评论是错误的。我正在尝试通过名称找到ID。我已经更正了我的原始帖子。 - clamp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接