如何从xml中的另一个包加载资源?

Posted

技术标签:

【中文标题】如何从xml中的另一个包加载资源?【英文标题】:How to load resource from another package in xml? 【发布时间】:2013-03-29 15:07:45 【问题描述】:

我知道存在这样的代码从另一个包安装资源 xml 文件的能力:

String resourceName = getResources().getResourceEntryName(layoutResID);
String resourceTypeName = getResources().getResourceTypeName(layoutResID);
Resources skinResources = getResourcesForPackage("com.my.skin");
int skinResourceId = skinResources.getIdentifier(resourceName, resourceTypeName, "com.my.skin");
mLayoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mLayoutInflater.inflate(skinResources.getXml(skinResourceId), null);
super.setContentView(mLayoutInflater.inflate(skinResources.getXml(skinResourceId), null));

但我想知道如何在 xml 和可绘制资源中制作相同的内容:

例如:我有两个应用程序:

应用程序 ma​​in 带有包“com.my.main” 和应用程序 skin 与包“com.my.skin

android中docs解释:

可能是对另一个资源的引用,形式为 "@[+][package:]type:name" 或表单中的主题属性 “?[包:][类型:]名称”。

我试图指定这样的内容:

android:background="@com.my.skin:drawable:background_image"

或者这个:

android:background="?com.my.skin:drawable:background_image"

但它不起作用,我的资源文件没有编译。

谁知道如何使用显式规范加载资源。

【问题讨论】:

【参考方案1】:

让你的项目成为一个库项目,你可以在另一个 android 项目中引用它。

图书馆项目

这些项目包含可共享的 Android 源代码您可以在 Android 项目中引用的资源。当您有想要重用的公共代码时,这很有用。库项目不能安装到设备上,但是,它们会在构建时被拉入 .apk 文件中。

有关更多信息,请查看主题图书馆项目下的链接。

http://developer.android.com/tools/projects/index.html

您的库项目将勾选一个复选框,如项目中所示。

您可以将库项目添加到您的 android 项目中。右键单击您的项目。转到属性。在左侧面板中选择 Android。

【讨论】:

【参考方案2】:

根据文档,您忘记在 @ 之后添加 +。最后的可绘制格式有一个错误输入:应该替换为/

这应该是正确的选项:

android:background="@+com.my.skin:drawable/background_image"

【讨论】:

以上是关于如何从xml中的另一个包加载资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何从解决方案中的文件加载 XML 文件,使用嵌入式资源构建?项目 > 跨平台 > Xamarin.Forms

从 Oauth2 中的另一个资源获取资源

如何从外部框架加载资源

从 Saxon 9.4he 中的嵌入式资源加载 xml 和 xslt

资源包中的资产目录

如何从我的 jar 文件中访问资源文件夹中的文件夹?