不能用应用程序中的png资源覆盖库的xml资源?

我有一个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. 

我如何覆盖库项目中的资源?

Solutions Collecting From Web of "不能用应用程序中的png资源覆盖库的xml资源?"

您不能简单地在Android SDK中覆盖具有不同扩展名的文件的资源ID(它是您正在覆盖的资源ID,而不是实际文件)。 然而,你可以通过放入你的项目xml文件( main_background.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" /> 

有了上面的解决scheme,你可以从你的项目中引用@drawable/main_background ,它应该使用你的文件,而不是一个库。

 [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中的两个资产命名相同。 而在你的项目中,可能会有一个同名的资产。 然而,我会检查它可以有不同的types。 XML与png不同,如果您从代码访问资产,您可能会遇到types错误。

让我澄清一下上述观点。 我知道一个库项目可以有一个与您的应用程序中的项目具有相同资源ID的项目。

然而,上面的错误表明,main_background.png和main_background.xml都在同一个项目([com.mycom.mylib.myapp]),我不相信是正确的。

进一步阅读

本页面描述了各种types的项目,包括库项目http://developer.android.com/tools/projects/index.html

现在我不知道我从哪里得到了印象,但再次查看它只是没有说明你可以通过使用相同的资源名称覆盖资源的任何地方。 上帝知道我为什么认为这是一个function。

因此,不,如我所知,同样的规则适用于资源必须在图书馆项目中唯一命名,否则生成的资源id将会发生冲突。 (你得到的错误)

解释的是如何pipe理资源冲突。

资源冲突由于这些工具将库项目的资源与从属应用程序项目的资源合并,因此可能会在两个项目中定义给定的资源ID。 在这种情况下,工具将从应用程序或优先级最高的库中select资源,并丢弃其他资源。 在开发应用程序时,请注意,公共资源ID很可能在多个项目中定义,并将与来自应用程序或最高优先级库的资源优先进行合并。

系统将使用优先级最高的资源,丢弃所有其他资源。 奇怪的是,你会认为编译错误不会发生,因为编译器应该丢弃资源。 这使我相信,原来的海报在同一个项目中有类似命名的资产,而不是跨越图书馆和项目。

我没有看到任何地方,这实际上是一个预期的function。 有任何链接说,否则? (评论他们)

所以我不认为这个问题的解决scheme是:

在相关库中定义一个XML文档(我们将其称为bunny.xml),并将其引用到具有相似名称(bunny_drawn.xml)的另一个xml中,以显示实际的内容。

然后,在目标项目中,将bunny.xmlreplace为另一个,并用它来引用具有不同名称的图像 – bunny_image.png

然而,这并不能解决问题,首先是因为我们在技术上不是用xml覆盖png(尽pipe效果有点接近)。 其次,因为覆盖资源的一个关键特征是被覆盖,即它们不被编译到APK中:

这些工具可确保在应用程序中声明的资源获得优先权,并且库项目中的资源不会编译到应用程序.apk中

但是bunny_drawn.xml仍然会被编译进去! 我们可以通过在目标APP中定义要replace的图像来解决第二个问题,还可以用空白的xmlreplace旧的目标bunny_drawn.xml。 (或者,正如Fenix指出的那样,在第一种情况下,可以在bunny.xml中包含bunny_drawn.xml的内容 – 事实上仍然是资源ID不能被replace…)

所以我的最后结论是,这个需要被提交作为开发工具中的错误。