我知道res目录中的文件可以从R.class访问,而资产的行为就像一个文件系统,但我想知道,一般来说,什么时候最好使用其中一个。谁能告诉我物权和资产之间的真实的区别?
res
R.class
9rnv2umw1#
对于资源,有一个内置的支持,可以为不同的语言、操作系统版本、屏幕方向等提供替代方案,正如这里所描述的。这些都不适用于资产。此外,API的许多部分支持使用资源标识符。最后,资源的名称被转换为常量字段名,在编译时检查。因此代码和资源本身之间不匹配的可能性更小。所有这些都不适用于资产。那么,为什么要有assets文件夹呢?如果你想计算你想在运行时使用的资产,这是相当容易的。对于资源,你必须声明一个所有可能使用的资源ID的列表,并计算列表的索引。(这有点笨拙,如果资源集在开发周期中发生变化,会引入错误的机会。)(编辑:你可以使用getIdentifier通过名称来检索资源ID,但是这失去了编译时检查的好处。)资源也可以被组织成文件夹层次结构,这是资源不支持的。这是一种不同的管理数据的方式。尽管资源涵盖了大多数情况,但资源也有其偶尔的用途。另一个不同之处:库项目中定义的资源会自动导入到依赖于该库的应用程序项目中。对于资产,不会发生这种情况;资产文件必须存在于应用程序项目的资产目录中。[编辑:在Android的新Gradle-based build system(与Android Studio配合使用)中,情况不再如此。库项目的资产目录被打包到. aar文件中,因此在库项目中定义的资产将合并到应用项目中(因此,如果它们位于引用库中,则不必存在于应用的/assets目录中)。]编辑:如果您想将自定义字体打包到应用中,则会出现另一个差异。API calls可用于从存储在文件系统或应用的assets/目录中的字体文件创建Typeface。但没有API可用于从存储在res/目录中的字体文件创建Typeface(或者从InputStream下载,这样就可以使用res/目录)。[**注意:**使用Android O(现已提供alpha预览版),您将能够将自定义字体作为资源包含在内。请参阅here对这一期待已久的功能的描述。但是,只要您的最低API级别为25或更低,您就必须坚持将自定义字体打包为资产,而不是资源。]
getIdentifier
/assets
assets/
Typeface
res/
InputStream
ttvkxqim2#
两者非常相似。两者之间真实的的主要区别是在res目录中,每个文件都有一个预编译的ID,可以通过R.id.[res id]轻松访问。这对于快速轻松地访问图像、声音、图标...assets目录更像是一个文件系统,它提供了更大的自由度来放置你想要的任何文件。然后你就可以像通过Java访问任何文件系统中的任何文件一样访问该系统中的每个文件。这个目录对于游戏细节、字典等非常有用。
ID
R.id.[res id]
assets
x0fgdtte3#
我知道这很老了,但为了说明清楚,在Android官方文档中对每一个都有一个解释:从http://developer.android.com/tools/projects/index.html开始
这是空的。你可以用它来存储原始资源文件。你保存在这里的文件被编译成一个. apk文件,原始文件名被保留。你可以像使用URI的典型文件系统一样导航这个目录,并使用AssetManager读取文件作为字节流。例如,这是一个很好的纹理和游戏数据的位置。
对于任意原始资源文件。将资源文件保存在此处而不是assets/目录中仅在访问方式上有所不同。这些文件由aapt处理,并且必须使用R类中的资源标识符从应用程序引用。例如,这是保存MP3或Ogg文件等媒体的好地方。
rt4zxlrg4#
以下是一些要点:1.原始文件的名称必须是有效的Java标识符,而资产中的文件没有位置和名称限制。换句话说,它们可以分组到任何我们希望的目录中1.原始文件很容易从Java和xml中引用(也就是说,您可以从manifest或其他xml文件中引用原始文件)。1.将资产文件保存在此处而不是assets/目录中,唯一的不同之处在于您访问它们的方式,如此处所述http://developer.android.com/tools/projects/index.html。1.在库项目中定义的资源会自动导入到依赖于该库的应用程序项目中。资产文件必须存在于应用程序项目的资产目录中
mgdq6dx15#
如果你需要在Java代码中引用它们,你应该把你的文件放到“res”目录中。而且res文件夹中的所有文件都将在R文件中建立索引,这使得加载它们要快得多(也容易得多!)。
yks3o0rb6#
使用像文件系统这样的资产来转储任何类型的文件,使用res来存储它的用途,布局,图像,值。
mitkmikd7#
Ted Hopp很好地回答了这个问题,我一直在使用res/raw作为我的opengl纹理和着色器文件,我在考虑将它们移到一个assets目录中,以提供一个层次结构的组织。这个帖子说服我不要这么做。首先,因为我喜欢使用唯一的资源id。其次,使用InputStream/openRawResource或BitmapFactory读取文件非常简单。第三,能够在便携式库中使用它非常有用。
lnxxn5zx8#
资产提供了一种在应用程序中包含文本、XML、字体、音乐和视频等任意文件的方法。如果你试图将这些文件作为“资源”包含进来,Android会将它们处理到它的资源系统中,你将无法获得原始数据。如果你想访问未被触及的数据,资产是一种方法。
8条答案
按热度按时间9rnv2umw1#
对于资源,有一个内置的支持,可以为不同的语言、操作系统版本、屏幕方向等提供替代方案,正如这里所描述的。这些都不适用于资产。此外,API的许多部分支持使用资源标识符。最后,资源的名称被转换为常量字段名,在编译时检查。因此代码和资源本身之间不匹配的可能性更小。所有这些都不适用于资产。
那么,为什么要有assets文件夹呢?如果你想计算你想在运行时使用的资产,这是相当容易的。对于资源,你必须声明一个所有可能使用的资源ID的列表,并计算列表的索引。(这有点笨拙,如果资源集在开发周期中发生变化,会引入错误的机会。)(编辑:你可以使用
getIdentifier
通过名称来检索资源ID,但是这失去了编译时检查的好处。)资源也可以被组织成文件夹层次结构,这是资源不支持的。这是一种不同的管理数据的方式。尽管资源涵盖了大多数情况,但资源也有其偶尔的用途。另一个不同之处:库项目中定义的资源会自动导入到依赖于该库的应用程序项目中。对于资产,不会发生这种情况;资产文件必须存在于应用程序项目的资产目录中。[编辑:在Android的新Gradle-based build system(与Android Studio配合使用)中,情况不再如此。库项目的资产目录被打包到. aar文件中,因此在库项目中定义的资产将合并到应用项目中(因此,如果它们位于引用库中,则不必存在于应用的
/assets
目录中)。]编辑:如果您想将自定义字体打包到应用中,则会出现另一个差异。API calls可用于从存储在文件系统或应用的
assets/
目录中的字体文件创建Typeface
。但没有API可用于从存储在res/
目录中的字体文件创建Typeface
(或者从InputStream
下载,这样就可以使用res/
目录)。[**注意:**使用Android O(现已提供alpha预览版),您将能够将自定义字体作为资源包含在内。请参阅here对这一期待已久的功能的描述。但是,只要您的最低API级别为25或更低,您就必须坚持将自定义字体打包为资产,而不是资源。]ttvkxqim2#
两者非常相似。两者之间真实的的主要区别是在
res
目录中,每个文件都有一个预编译的ID
,可以通过R.id.[res id]
轻松访问。这对于快速轻松地访问图像、声音、图标...assets
目录更像是一个文件系统,它提供了更大的自由度来放置你想要的任何文件。然后你就可以像通过Java访问任何文件系统中的任何文件一样访问该系统中的每个文件。这个目录对于游戏细节、字典等非常有用。x0fgdtte3#
我知道这很老了,但为了说明清楚,在Android官方文档中对每一个都有一个解释:
从http://developer.android.com/tools/projects/index.html开始
一个月一个月
这是空的。你可以用它来存储原始资源文件。你保存在这里的文件被编译成一个. apk文件,原始文件名被保留。你可以像使用URI的典型文件系统一样导航这个目录,并使用AssetManager读取文件作为字节流。例如,这是一个很好的纹理和游戏数据的位置。
一个月一个月
对于任意原始资源文件。将资源文件保存在此处而不是assets/目录中仅在访问方式上有所不同。这些文件由aapt处理,并且必须使用R类中的资源标识符从应用程序引用。例如,这是保存MP3或Ogg文件等媒体的好地方。
rt4zxlrg4#
以下是一些要点:
1.原始文件的名称必须是有效的Java标识符,而资产中的文件没有位置和名称限制。换句话说,它们可以分组到任何我们希望的目录中
1.原始文件很容易从Java和xml中引用(也就是说,您可以从manifest或其他xml文件中引用原始文件)。
1.将资产文件保存在此处而不是assets/目录中,唯一的不同之处在于您访问它们的方式,如此处所述http://developer.android.com/tools/projects/index.html。
1.在库项目中定义的资源会自动导入到依赖于该库的应用程序项目中。资产文件必须存在于应用程序项目的资产目录中
1.与资源不同,资产可以被组织到资产目录下的子文件夹中。然而,你对资产唯一能做的事情就是获取输入流。因此,在资产中存储字符串或位图没有多大意义,但你可以存储自定义格式的数据,如输入校正字典或游戏Map。
1.但是,如果您需要更大的灵活性来处理特殊情况,那么资产可以为您提供一个较低级别的API,允许您以更高的自由度来组织和处理资源。
mgdq6dx15#
如果你需要在Java代码中引用它们,你应该把你的文件放到“res”目录中。
而且res文件夹中的所有文件都将在R文件中建立索引,这使得加载它们要快得多(也容易得多!)。
yks3o0rb6#
使用像文件系统这样的资产来转储任何类型的文件,使用res来存储它的用途,布局,图像,值。
mitkmikd7#
Ted Hopp很好地回答了这个问题,我一直在使用res/raw作为我的opengl纹理和着色器文件,我在考虑将它们移到一个assets目录中,以提供一个层次结构的组织。
这个帖子说服我不要这么做。首先,因为我喜欢使用唯一的资源id。其次,使用InputStream/openRawResource或BitmapFactory读取文件非常简单。第三,能够在便携式库中使用它非常有用。
lnxxn5zx8#
资产提供了一种在应用程序中包含文本、XML、字体、音乐和视频等任意文件的方法。如果你试图将这些文件作为“资源”包含进来,Android会将它们处理到它的资源系统中,你将无法获得原始数据。如果你想访问未被触及的数据,资产是一种方法。