我有一个Android库MyLib
,其中包含我的应用所需的一切(定位到Android 2.2)。该库具有XML资源:
drawable/main_background.xml
在我的申请MyApp
项目中,我引用了MyLib
。在这里,我想覆盖特定的资源(即品牌)。所以我在MyApp
中添加了背景图片:
drawable/main_background.png
Eclipse一直给我这个错误:
[com.mycom.mylib.myapp] res\drawable\main_background.xml:0: error: Resource entry main_background is already defined.
[com.mycom.mylib.myapp] res\drawable\main_background.png:0: Originally defined here.
如何覆盖库项目中的资源?
答案 0 :(得分:11)
您不能简单地使用Android SDK中具有不同扩展名的文件覆盖资源ID(它是您要覆盖的资源ID,而不是实际文件)。但是,您可以通过放入具有相同名称(main_background.xml
)的项目xml文件来完成这一操作,并以适当的方式填充它以显示您需要重命名的新文件(main_background.png
)。早。您需要的所有语法都在这里描述:
http://developer.android.com/guide/topics/resources/drawable-resource.html
,在您的情况下,它可能很简单(假设您将此作为main_background.xml
放入非库项目中,并且您的新png为main_background_new.png
):
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/main_background_new" />
使用上述解决方案,您可以从项目中引用@drawable/main_background
,它应该使用该项目中包含的文件,而不是库中的文件。
答案 1 :(得分:4)
[com.mycom.mylib.myapp] res\drawable\main_background.xml:0: error: Resource entry main_background is already defined.
[com.mycom.mylib.myapp] res\drawable\main_background.png:0: Originally defined here.
我不相信即使使用不同的扩展名也可以使用相同的文件名。尝试将png命名为其他内容。
现在,我没有使用覆盖,所以这看起来很奇怪,因为你希望这是你重写资产的方式。但是我认为你要么在你的lib中有两个资产命名相同。在您的项目中,拥有相同名称的资产可能没问题。然而,我会检查它有不同的类型。 XML与png不同,如果从代码访问资产,则可能会出现类型错误。
让我澄清以上几点。我知道库项目可以有一个项目,其资源ID与应用程序中的项目相同。
但是上面的错误表明main_background.png和main_background.xml都在同一个项目([com.mycom.mylib.myapp])中,我认为这是正确的。
进一步阅读
此页面描述了各种类型的项目,包括库项目http://developer.android.com/tools/projects/index.html
现在我不知道我从哪里得到了这个印象,但是再看一遍,它根本没有说明你可以使用相同的资源名称覆盖资源的任何地方。天知道为什么我认为这是一个特征。
所以不,据我所知,同样的规则适用于资源必须在库项目中唯一地命名,否则生成的资源ID将发生冲突。 (你得到的错误)
解释的是如何管理资源冲突。
资源冲突由于工具合并了库的资源 项目与依赖应用程序项目的项目,给定 可以在两个项目中定义资源ID。在这种情况下,工具 从应用程序或具有最高的库中选择资源 优先级,并丢弃其他资源。随着你的发展 应用程序,请注意可能是公共资源ID 在多个项目中定义并将与资源合并 来自应用程序或优先级最高的库。
系统将使用优先级最高的资源,丢弃其他所有资源。奇怪的是,你会认为编译错误不会发生,因为编译器应该丢弃资源。这让我相信原始海报在相同项目中具有类似命名的资产,而不是在lib和项目中。
我没有在任何地方读到这实际上是一个预期的功能。有没有链接说不然? (评论他们)
答案 2 :(得分:3)
因此,我不认为这个问题的一个“解决方案”是:
在相关库中定义一个XML文档(我们称之为bunny.xml),并让它引用另一个类似名称的xml(bunny_drawn.xml),并显示实际内容。
然后,在目标项目中,使用另一个覆盖bunny.xml并使用它来引用具有不同名称的图像 - bunny_image.png
然而,这并没有解决问题,首先是因为我们在技术上没有用xml覆盖png(尽管效果有点接近)。其次,因为覆盖资源的一个关键特性是它们被覆盖,即它们不会被编译到APK中:
这些工具可确保应用程序中声明的资源得到 优先级以及库项目中的资源未编译 进入应用程序.apk
但仍然会编译bunny_drawn.xml!我们可以通过不仅定义目标APP中要替换的图像,而且还用空白的xml替换旧目标bunny_drawn.xml来排序第二点。 (或者,正如Fenix指出的那样,在第一种情况下你可以在bunny.xml中包含bunny_drawn.xml的内容 - 事实仍然是资源ID无法替换......)
所以我的最终结论是,这需要作为开发人员工具中的错误提交。