问题描述
通过资源,内置支持为不同语言、操作系统版本、屏幕方向等提供替代方案,如此处所述。这些都不适用于资产。此外,API 的许多部分都支持使用资源标识符。最后,资源的名称被转换为在编译时检查的常量字段名称,因此代码和资源本身之间不匹配的机会更少。这些都不适用于资产。
那么为什么有一个资产文件夹呢?如果你想计算你想在运行时使用的资产,这很容易。对于资源,您必须声明可能使用的所有资源 ID
的列表,并计算列表中的索引。(如果资源集在开发周期中发生变化,这有点尴尬,并且会引入出错的机会。)(编辑:您可以使用名称检索资源 IDgetIdentifier
,但这失去了编译时检查的好处。)资产可以也被组织成一个文件夹层次结构,这是资源不支持的。这是一种不同的数据管理方式。尽管资源涵盖了大多数情况,但资产偶尔也会用到。
另一个区别:在库项目中定义的资源会自动导入到依赖于库的应用程序项目中。对于资产,这不会发生;资产文件必须存在于应用程序项目的资产目录中。[编辑:使用
Android 新的基于 Gradle 的构建系统(与 Android Studio 一起使用),这不再适用。/assets
库项目的资产目录被打包到 .aar
文件中,因此库项目中定义的资产被合并到应用程序项目中(因此,如果它们在引用的库中,它们不必存在于应用程序的目录中)。]
编辑:如果您想将自定义字体与您的应用程序打包,则会出现另一个差异。有API
调用Typeface
可以从存储在文件系统或应用程序assets/
目录中的字体文件创建一个。但是没有API可以Typeface
从存储在res/
目录中的字体文件(或从InputStream
允许使用res/
目录的
)创建一个。[ 使用 Android O(现在提供 alpha
预览版),您将能够将自定义字体作为资源包含在内。请参阅此处对这个过期已久的功能的描述。但是,只要您的最低 API 级别为 25
或更低,您就必须坚持将自定义字体打包为资产而不是资源。]
解决方法
我知道res
目录中的文件可以访问,R.class
而资产的行为类似于文件系统,但我想知道,一般来说,什么时候最好使用一个和另一个。
谁能帮助我了解资源和资产之间的真正区别?