如何使应用程序的矢量图形覆盖库中的矢量图形?

7
我有一个库项目和一个应用程序项目。除其他事项外,库项目包含一些png和一些矢量可绘制图形。现在,我可以通过给它相同的名称轻松地覆盖应用程序项目中的png可绘制图像,并且它将被正确显示。但是,这对于矢量可绘制图形不起作用:无论是在Android 4还是5上,应用程序始终显示库中定义的矢量可绘制图形。应用程序永远不会显示应用程序项目的矢量可绘制图形。 谷歌声称应用程序的资源始终优先于库的资源
由于工具将库模块的资源与依赖的应用程序模块的资源合并,因此给定的资源ID可能在两个模块中都定义。在这种情况下,工具从应用程序或最高优先级的库中选择资源,并且放弃另一个资源。在开发应用程序时,请注意常见的资源ID可能在多个项目中定义,并且将合并,应用程序或最高优先级的库的资源将具有优先权。
但正如我所说,就矢量可绘制图形而言,出于某种原因,情况恰恰相反。你有什么想法可以确保矢量可绘制图形像普通可绘制图形和其他资源一样被覆盖吗?

更新已在支持库v23.2中解决!现在无需做任何操作 :)

2个回答

11
当构建库项目时,VectorDrawable会为每个密度创建PNG文件,并将原始的VectorDrawable放置在drawable-anydpi-v21中。
如果您将VectorDrawable放置在应用程序的drawable-anydpi-v21中,则它将覆盖库项目中的可绘制对象。这似乎是一个bug,如果还不存在问题,那么应该创建一个新的问题。
注意:这不会替换库中生成的PNG文件。您还需要将它们添加到您的应用程序中以覆盖它们。

这个可以用,谢谢!顺便提一下,第二段中文件夹名称拼错了,请小心复制粘贴 :)(无法编辑帖子,因为只有一个字符更改) - sigute
谢谢朋友,你救了我。这个 Android 构建系统坏得像肿胀的猫一样,太糟糕了。 - silentsudo

3
根据Jared Rummler答案中的"NOTE",并且由于这个答案无法在评论中显示,我将在此为那些难以找到生成的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轻松完成此操作。这将使所有冗余文件位于未版本化文件下。
因为这个愚蠢的错误,现在除了drawable-anydpi-v21之外,还有7个额外的文件夹 :(
更新: 已在支持库v23.2中解决!从今天开始,终于不需要执行上述任何操作。只需确保在所有地方使用app:srcCompat而不是android:src。

1
将PNG文件添加到ldpi、mdpi、hdpi、xhdpi、xxhdpi和xxxhdpi也可以。在构建时会添加“-v4”后缀。 - Jared Rummler
关于 app:srcCompat 的更新提醒我,我已经打开了 vectorDrawables.useSupportLibrary,这正是我需要的提醒。 - Thorbear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接