【问题标题】:android import ressources from library projectandroid从库项目中导入资源
【发布时间】:2011-06-12 02:35:09
【问题描述】:

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

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 中看到它

【问题讨论】:

  • 是com.package在你的库项目AndroidManifest.xml中定义的包
  • 是的。所有类都在这个包中。

标签: android xml resources android-library


【解决方案1】:

看起来像

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

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

这里有一些调试/替代想法:


  • 您可能已经这样做了十几次了,不过还是要提一下:首先重新检查所有内容的拼写:

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

  • 您能否访问该库中的任何资源,或者该问题特定于该资源 (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, getting resource ID from string?

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

【讨论】:

【解决方案2】:

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

import com.application.libraryproject.R

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

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

或类似的。

【讨论】:

  • 谢谢,实际上我的问题是错误的。我的问题实际上是获取资源的 id,我尝试使用 getIdentifier 和它的名称找到它。
【解决方案3】:

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

在你的情况下,应该是:

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

【讨论】:

  • 感谢您的回答,它有帮助!
【解决方案4】:

是的,像往常一样定义库项目中的资源。然后在导入库的项目中引用它们,方法是在库的 AndroidManifest.xml 中为 R 类添加包名。

【讨论】:

  • 好的,但是如果我想用这个函数getResources().getString(int id)获取字符串怎么办
  • 它与使用标准R类完全相同,getResources().getSTring(R.string.somestringyouwanttouse)
  • 谢谢,实际上我之前的评论是错误的。我正在尝试通过其名称查找 id。我现在已经更正了我原来的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多