首页 > 解决方案 > 可绘制缩小不适用于另一个模块中声明的资产

问题描述

分享知识,问答风格

考虑具有通用库模块和配置库模块的多个应用程序模块的应用程序架构。库模块引用应用模块提供的资源。这可以实现特定于目标的优化:仅发布带有该应用变体使用的资源的应用。

引用 library 模块中的资源,使用 values 资源引入标识符:

<resources>
  <item name="foo" type="drawable"/>
</resources>

然后在应用模块中提供资产:

app1/src/main/res/drawable-xhdpi/foo.png # variant for app1
app2/src/main/res/drawable-xhdpi/foo.png # variant for app2
# app3 configuration does not use drawable/foo, no need to provide

没有为每个密度桶提供资产,而是依靠系统选择最接近的匹配并根据需要扩大或缩小规模,并获得足够好的结果。

现在,当 app1 在 mdpi 密度设备(如平板电脑)上运行时,得到

android.content.res.Resources$NotFoundException:
Drawable app1.package.name:drawable/foo with resource ID #0x7f123456

如果 .png 资源直接包含在库模块中,则此最近匹配资源加载工作正常。不想在其中包含所有图像资产,因为这会使应用程序不必要地膨胀。

这种最接近匹配的资源加载在放大时可以正常工作,例如 xhdpi -> xxhdpi。只有像 xhdpi -> mdpi 这样的缩减会导致问题。

标签: androidandroid-resources

解决方案


通过将 .png 资源移动到 drawable-mdpi 解决了崩溃问题。


推荐阅读