1、程序,把Assets中的图像显示出来

try {
BufferedInputStream bis = new BufferedInputStream(getAssets()
.open("a.bmp"));
Bitmap bm = BitmapFactory.decodeStream(bis);
imageView01.setImageBitmap(bm);

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("==========file not found======");
}

2、原理:Android中的资源分析
资源是Android应用程序中重要的组成部分。在应用程序中经常会使用字符串、菜单、图像、声音、视频等内容,都可以称之为资源。通过将资源放到与apk文件中与Android应用程序一同发布,在资源文件比较大的情况下,可以通过将资源作为外部文件来使用,我们将分析如何在Android应用程序中存储这些资源。

一、资源的存储

在android中,资源大多都是保存在res目录中,例如布局资源以XML文件的形式保存在res\layout目录中;图像资源保存着res\drawable目录中;菜单资源保存在res\menu目录中。ADT在生成apk文件时,这些目录中的资源都会被编译,然后保存到apk文件中。如果将资源文件放到res\raw目录中,资源将在不编译的情况下放入apk文件中。在程序运行时可以使用InputStream来读取res\raw目录中的资源。

如果使用的资源文件过大,我们可以考虑将资源文件作为外部文件单独发布。Android应用程序会从手机内存或者SD卡读取这些资源文件。

二、资源的种类

从资源文件的类型来划分,我们可以将资源文件划分为XML、图像和其它。以XML文件形式存储的资源可以放在res目录中的不同子目录里,用来表示不同种类的资源;而图像资源会放在res\drawable目录中。除此之外,可以将任意的资源嵌入Androidy应用程序中。比如音频和视频等,一般这些资源放在res\raw目录中。

表1、 Android支持的资源
目录 资源类型 描述
Res\values
XML
保存字符串、颜色、尺寸、类型、主题等资源,可以是任意文件名。对于字符串、颜色、尺寸等信息采用
Key-value形式表示,对于类型、主题等资源,采用其它形式表示
Res\layout
XML
保存布局信息。一个资源文件表示一个View或ViewGroup的布局
Res\menu
XML
保存菜单资源。一个资源文件表示一个菜单(包括子菜单)
Res\anim
XML
保存与动画相关的信息。可以定义帧(frame)动画和补间(tween)动画
Res\xml
XML
在该目录的文件可以是任意类型的XML文件,这些XML文件可以在运行时被读取。
Res\raw
任意类型
在该目录中的文件虽然也会被封装在apk文件中,但不会被编译。在该目录中可以放置任意类型的文件,例如,各种类型的文档、音频、视频文件等
Res\drawable
图像
该目录中的文件可以是多种格式的图像文件,例如,bmp、png、gif、jpg等。在该目录中的图像不需要分辨率非常高,aapt工具会优化这个目录中的图像文件。如果想按字流读取该目录下的图像文件,需要将图像文件放在res\raw目录中。
assets
任意类型
该目录中的资源与res\raw中的资源一样,也不会被编译。但不同的是该目录中的资源文件都不会生出资源ID
三、资源文件的命名

每一个资源文件或资源文件中的key-value对都会在ADT自动生成的R类(在R.java文件中)中找到相对应的ID.其中资源文件名或key-value对中的key就是R类中的java变量名。因此,资源文件名好key的命名首先要符合java变量的命名规则。

除了资源文件和key本身的命名要遵循相应的规则外,多个资源文件和key也要遵循唯一的原则。也就是说,同类资源的文件名或key不能重复。例如,两个表示字符串资源的key不能重复,就算这两个key在不同的XML文件中也不行。

由于ADT在生成ID时并不考虑资源文件的扩展名,因此,在res\drawable、res\raw等目录中不能存在文件名相同,扩展名不同的资源文件。例如在res\drawable目录不能同时放置icon.jpg和icon.png文件。

四、资源使用示例

在Android SDK中不仅提供了大量的系统资源,而且还允许开发人员定制自己的资源。不管是系统资源,还是自定义的资源,一般都会将这些资源放在res目录中,然后通过R类中的相应ID来引用这些资源。接下来将针对于XML类资源的使用进行分析。

XML资源实际上就是XML格式的文本文件,这些文件必须放在res\xml目录中。可以通过Resources.getXml方法获得处理指定XML文件的XmlResourceParser对象。实际上,XmlResourceParser对象处理XML文件的的过程主要是针对不同的状态点处理相应的代码,比如开始分析文档、开始分析标签、分析标签完成等,XmlResourceParser通过调用next方法不断更新当前的状态。

下面的代码,则是展示如何读取res\xml目录中的XML文件的内容,先在res\xml目录中建立一个xml文件。将AndroidManifest.xml文件复制到res\xml目录中,并改名为android.xml。

在准备完XML文件后,在onCreate方法中开始读取XML文件的内容,代码如下:

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView=(TextView)findViewById(R.id.textview);
StringBuffer sb=new StringBuffer();
// 获得处理android。xml文件的XmlResourceParser对象
XmlResourceParser xml=getResources().getXml(R.xml.android);
try
{
//切换到下一个状态,并获得当前状态的类型
int eventType =xml.next();
while(true)
{
//文档开始状态
if(eventType == XmlPullParser.START_DOCUMENT)
{
Log.d("start_document","start_document");
}
//标签开始状态
else if(eventType ==XmlPullParser.START_TAG)
{
Log.d("start_tag",xml.getName());
//将标签名称和当前标签的深度(根节点的depth是1,第2层节点的depth是2,类推)
sb.append(xml.getName()+"(depth:"+xml.getDepth()" ");
//获得当前标签的属性个数
int count=xml.getAttributeCount();
//将所有属性的名称和属性值添加到StringBuffer对象中
for(int i=0;i<count;i++)
{
sb.append(xml.getAttributeName(i)+":
"+xml.getAttributeValue(i)+"");
}
sb.append(")\n");
}
//标签结束状态
else if(eventType ==XmlPullParser.END_TAG)
{
Log.d("end_tag",xml.getName());
}
//读取标签内容状态
else if(eventType ==XmlPullParser.TEXT)
{
Log.d("text","text");
}
//文档结束状态
else if(eventType ==XmlPullParser.END_DOCUMENT)
{
Log.d("end_document","end_document");
//文档分析结束后,退出while循环
break;
}
//切换到下一个状态,并获得当前状态的类型
eventType =xml.next();

}
textView.setText(sb.toString());


}
catch(Exception e) {}
}

二、如果想读入文件

在使用getAssets().open("anhui.xml")返回输人流之后,就可以以此为参数,后面的处理跟普通的java的处理相同。

更多相关文章

  1. android JNI C代码对sdcard中文件的操作
  2. android远程控制(一)----发现驱动文件里代码含义
  3. Mtk Android(安卓)app 默认激活设备管理器
  4. Android(安卓)权限中文说明
  5. Android(安卓)studio 43 文件存储到sdcard download文件夹下
  6. android多国语言文件夹汇总
  7. Android(安卓)SDK 源码下载,eclipse关联代码
  8. MTK Android(安卓)N 源码Rom Root
  9. android如何读取assets目录下的资源

随机推荐

  1. 十万火急!如何远程复制sql2000数据库
  2. 求SQL语句,有没有周末上班的高手,给帮个忙
  3. 谁能给我讲讲用C#在windows mobile上开发
  4. Sql Server系列:Insert语句
  5. CentOS系统操作mysql的常用命令
  6. xp使用mysql出现的问题
  7. Oracle的临时表空间
  8. 数据库不支持中文解决方案(mysql)
  9. sql2000 第一次执行慢
  10. SQL 在线 UML 设计器 — 使用详解