Android模块中是否有任何方法可以从自己的模块中获取资源而不是从应用程序模块中获取资源?

时间:2017-02-28 16:04:21

标签: android gradle

我正在创建一个Android依赖库,它将打包为AAR文件。依赖项将包含layoutsstringsdimensimages等。我创建了一个包含此依赖项的示例演示项目。

现在考虑以下情况。

我的库包含一个名为Image的{​​{1}}文件,并在布局文件中使用它。演示项目还有一个名为filter.png的{​​{1}},但它是一个不同的图像。因此,当项目构建完成后,只会选择应用程序的Image。所以即使在我的库的布局文件中,我也看到了演示项目使用的图像。

截至目前,我已在每个资源名称之前更改了名称和附加的包名称,以避免出现上述情况。 但有什么方法可以强迫Android只从当前模块中选择资源吗?

2 个答案:

答案 0 :(得分:2)

你的app和库将有不同的包名,是的。

  

截至目前,我已在每个资源名称之前更改了名称和附加的包名称,以避免出现上述情况

这是正确的,因为资源与包名相关联。

com.example.app.R.drawable.filter(通常仅R.drawable.filter检查您的import声明!),当前模块。

与其他模块com.example.library.R.drawable.filter

相对照

Android - Accessing Resources

  

[<package_name>.]R.<resource_type>.<resource_name>

答案 1 :(得分:2)

库只能访问自己的资源集,但没有什么可以阻止应用程序故意覆盖库的资源。

为防止意外覆盖,通常在库资源名称前加上前缀。例如,AppCompat使用abc_前缀,而设计支持库使用design_前缀。

此外,you can explicitly declare which resources of your library are public,默认情况下其他的将是私有的,如果应用程序覆盖它们,您将收到Lint警告。