无法在应用程序中使用png资源覆盖库的xml资源?

时间:2012-04-07 15:57:04

标签: android resources library-project

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

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

3 个答案:

答案 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无法替换......)

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