从库项目访问应用程序资源

时间:2012-02-23 21:02:37

标签: android

我的申请取决于图书馆项目。

menu.xml 文件位于应用程序项目中 所有java代码都在库项目中,包括菜单处理程序代码 onOptionsItemSelected()

有没有办法从库项目访问应用程序资源?我想写这样的东西,这是目前不可能的,因为从库中看不到菜单项:

if ( item.getItemId()==R.id.settings ) {
...
}

3 个答案:

答案 0 :(得分:20)

是的,如果您知道图书馆的包裹名称,则可以 Resources.getIdentifier(...)

你可以这样做:

getResources().getIdentifier("res_name", "res_type", "com.library.package");

例如:

R.id.settings将是:

getResources().getIdentifier("settings", "id", "com.library.package");

答案 1 :(得分:13)

您应该在库项目中包含menu.xml资源的版本。如果您希望在应用程序中使用不同的menu.xml,则可以执行此操作,它将覆盖库项目中的副本。

来自Library Projects docs

  

如果在应用程序和库中都定义了资源ID,则这些工具可确保应用程序中声明的资源获得优先级,并且库项目中的资源不会编译到应用程序.apk中。这使您的应用程序可以灵活地使用或重新定义任何库中定义的任何资源行为或值。

答案 2 :(得分:0)

我发现@triadResources.getIdentifier(String, String, String)的{​​{3}}容易出错:

  • 在运行时解析资源会导致IDE忽略拼写错误,
  • 多个String参数更易于错误使用。

我发现这种方法对我来说更好:

String libString = context.getString(example.library.pkg.R.string.library_string)

该库的软件包为example.library.pkg

  • 该库的R类在编译时已解决,因此您的IDE会告诉您是否正确引用了它
  • import使用库的R类,以后您仍然可以使用自己的本地R, 并明确标记外部资源使用情况,使他们更容易发现。