Android项目中res与assets资源的区别
Android应用可以将资源存储在两个目录:res和assets。其中res目录中的资源只能存储在相应的子目录(如res/layout、res/values等)中,不能直接将资源存储在res目录中。assets目录中的资源可以任意存放,也可以建立任意层次的子目录。res和assets资源的主要区别如下。
1、引用资源的方式不同
res目录中的所有资源都会在R类的相应子类中生成对应的int类型变量,需要使用这些变量来引用资源。例如res/layout/main.xml是布局文件资源,会在R.layout类中生成一个名为main的
变量,所以需要使用R.layout.main来引用main.xml。
assets目录中的资源需要直接使用文件名来引用,例如assets/xyz.xml、assets/abc/test.db是assets目录中的两个资源文件,其中abc是assets中的子目录。可以使用如下的代码引用这两个资源文件,并返回与资源文件对应的InputStream对象,剩下的操作就是普通的Java代码输入流操作了。
InputStream is1=getResources().getAssets().open("xyz.xml");
InputStream is2=getResources().getAssets().open("abc/test.db");
2、处理方式不同
res目录中的资源子目录除了raw外,其他资源目录中的资源文件都会被编译,这也是为什么将APK文件解压后无法直接查看XML格式资源文件内容的原因。而assets与res/raw目录中的资源文件不会做任何处理,所以将APK解压后,这两个目录中的资源文件都会保持原样.
3、子目录不同
res目录只能有一层子目录,而且这些子目录必须是预定义的,如res/layout、res/values等都是合法的,而res/abc,res/xyz并不是合法的资源目录,在assets目录中可以建任意层次的子目录(只受操作系统的限制)
Bitmap bgImg = getImageFromAssetFile( "background.png" ); /** * 从assets中读取图片 */ private Bitmap getImageFromAssetsFile(String fileName) { Bitmap image = null; AssetManager am = getResources().getAssets(); try { InputStream is = am.open(fileName); image = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { e.printStackTrace(); } return image; }
二、如果在res/drawable目录下建了一个名为ppt的子目录,则通过 R.drawable.ppt.xxx 是获取不到ppt目录下的xxx文件的,会报 "R.layout.ppt cannot be resolved" 的错误。若在assets目录下建立一个名为ppt的子目录,并将background.png放入其中,则代码 Bitmap bgImg = getImageFromAssetFile( "ppt/background.png" ); 可正常运行。