6

我有一个库项目和一个应用程序项目。除了其他东西,libary 项目还包含一些 png 和一些矢量绘图。现在我可以很容易地覆盖应用程序项目中的 png drawable,方法是给它相同的名称,它会正确显示。但是,这不适用于矢量可绘制对象:该应用程序始终显示库中定义的矢量可绘制对象,无论是在 Android 4 还是 5 上。该应用程序永远不会显示应用程序项目的矢量可绘制对象。

谷歌声称应用程序的资源总是优先于图书馆的资源

由于这些工具将库模块的资源与依赖应用程序模块的资源合并,因此可以在两个模块中定义给定的资源 ID。在这种情况下,工具从应用程序或具有最高优先级的库中选择资源,并丢弃其他资源。在开发应用程序时,请注意公共资源 ID 可能会在多个项目中定义并且将被合并,应用程序或最高优先级库中的资源优先。

但正如我所说,对于矢量可绘制对象,出于某种原因,情况正好相反。知道我能做些什么来确保矢量绘图被覆盖,就像普通绘图和其他资源一样?

更新在支持库 v23.2 中解决!现在无事可做:)

4

2 回答 2

9

构建库项目时,VectorDrawable会为每个密度创建 PNG 文件,并将原始文件VectorDrawable放在drawable-anydpi-v21中。

如果您将您VectorDrawableindrawable-anydpi-v21放在您的应用程序中,那么它将覆盖您的库项目中的可绘制对象。这似乎是一个错误,应该创建一个新问题(如果尚不存在)。


注意:这不会替换库中生成的 PNG 文件。您还需要将它们添加到您的应用程序中以覆盖它们。

于 2016-01-07T11:16:44.390 回答
3

基于 Jared Rummler 的回答中的“注意”,由于这不适合评论,我将在此处为找不到生成的 PNG 文件的人发布一个小教程:

您可以在其中找到包含所需文件的文件夹,build/intermediates/res/merged/debug或者,如果您使用的是产品风味build/intermediates/res/merged/<flavor>/debug。现在将PNG文件复制到应用程序最简单的方法是完全复制它们的文件夹,它们是:

drawable-ldpi-v4
drawable-mdpi-v4
drawable-hdpi-v4
drawable-xhdpi-v4
drawable-xxhdpi-v4
drawable-xxxhdpi-v4

作为最后一个乏味的步骤,您应该删除您不需要的所有文件,即那些不是从您的矢量绘图生成的文件。如果您使用 VCS,只需添加您需要的 PNG 即可轻松完成此操作。这会将所有冗余文件置于 Unversioned Files 下。

你去吧,连同drawable-anydpi-v21,现在有7个额外的文件夹,只是因为这个愚蠢的错误:(

更新在支持库 v23.2 中解决!到今天为止,终于不需要做以上任何事情了。只要确保在任何地方都使用 app:srcCompat 而不是 android:src。

于 2016-01-08T08:32:51.787 回答