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

14

我的应用程序依赖于一个库项目。

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

有没有办法从库项目中访问应用程序资源?我想写类似这样的代码,但目前不可能,因为菜单项在库中不可见:

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

4
如果你的库需要做出关于应用程序项目内容的假设,那么你可能需要重新考虑你的设计。如果菜单是你希望与其他项目共享的内容,那么将菜单移动到库项目中。 - Justin Breitfeller
我忘了提到库项目包含除一个菜单以外的所有菜单。 该项目菜单有一个额外的“获取专业版”菜单项。 - tos
也许你想从库活动中进行子类化,并手动添加“升级专业版”的菜单选项。 - Justin Breitfeller
是的,我认为这肯定是最优雅的方法。Triad的解决方案具有快速的优点。 - tos
3个回答

23

如果你知道库的包名称,就可以使用资源管理器(Resource)中的 getIdentifier 方法实现。参考:Resources#getIdentifier

你可以这样做:

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

例如:

R.id.settings 将会是:

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

好的,我该如何访问"android:windowBackground"? - deadfish
2
总是返回“0”,这意味着找不到它。 - java acm

13
您应该将 menu.xml 资源的一个版本包含在您的库项目中。如果您想在应用程序中使用不同的 menu.xml ,则可以这样做,它会覆盖库项目中的副本。
根据库项目文档:
当应用程序和库中都定义了资源ID时,工具确保应用程序中声明的资源优先级最高,并且不会将库项目中的资源编译到应用程序的.apk文件中。这使您的应用程序具有使用或重新定义任何库中定义的资源行为或值的灵活性。

这可能是解决问题的最佳综合方案 - 完全消除需求。我尝试过了,效果很好。谢谢。 - tos
请注意,这在使用数据绑定时效果不佳。有关数据绑定的更多信息,请参阅:https://developer.android.com/tools/data-binding/guide.html。 - PLNech

1
我发现使用Resources.getIdentifier(String, String, String)方法时,@triadsolution有一定的错误风险:
  • IDE没有检查字符串字面上的资源标识符
  • 对于单个方法中多个连续的String参数,容易使用不正确。
我发现以下方法适合我:
String libString = context.getString(example.library.pkg.R.string.library_string)

这个库的包名是 example.library.pkg

  • 在编译时会解析库的 R 类,因此您的 IDE 会告诉您是否正确引用了它。
  • 不导入库的 R 类仍然可以使用本地的 R,并且显式标记外部资源使用使其更易于发现。

这对我没用。@medavox,你觉得你能在这里帮助我吗?https://stackoverflow.com/questions/64446897/translations-android-library-error-cannot-find-symbol - trixo
我在@trixo处找到了一个解决方案。请检查您的清单文件中是否声明包名。 - Divya Gupta

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