【转】Android中的资源分析、读取【2012113】

原文地址:http://www.cnblogs.com/hbbbs/archive/2012/11/04/2754247.html

转自:http://www.eoeandroid.com/home.php?mod=space&uid=614925&do=blog&id=4704

    最近在网上看到一篇将Android资源处理描写得将为完整的blog,转一下!以下为博文内容:


    资源是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目录中。

三、相关文件夹介绍


     在Android项目文件夹里面,主要的资源文件是放在res文件夹里面的。assets文件夹是存放不进行编译加工的原生文件,即该文件夹里面的文件不会像xml,java文件被预编译,可以存放一些图片,html,js, css等文件。在后面会介绍如何读取assets文件夹的资源!
     res文件夹里面的多个文件夹的各自介绍(来自网上的Android开发指南中文版内容):

目录Directory

资源类型Resource Types

res/anim/

XML文件,它们被编译进逐帧动画(frame by frame animation)或补间动画(tweened animation)对象

res/drawable/

.png、.9.png、.jpg文件,它们被编译进以下的Drawable资源子类型中:

要获得这种类型的一个资源,可以使用Resource.getDrawable(id)

位图文件

9-patches(可变尺寸的位图)

为了获取资源类型,使用mContext.getResources().getDrawable(R.drawable.imageId)

注意:放在这里的图像资源可能会被aapt工具自动地进行无损压缩优化。比如,一个真彩色但并不需要256色的PNG可能会被转换为一个带调色板的8位PNG。这使得同等质量的图片占用更少的资源。所以我们得意识到这些放在该目录下的二进制图像在生成时可能会发生变化。如果你想读取一个图像位流并转换成一个位图(bitmap),请把图像文件放在 res/raw/目录下,这样可以避免被自动优化。

res/layout/

被编译为屏幕布局(或屏幕的一部分)的XML文件。参见布局声明(Declaring Layout)

res/values/

可以被编译成很多种类型的资源的XML文件。

注意: 不像其他的res/文件夹,它可以保存任意数量的文件,这些文件保存了要创建资源的描述,而不是资源本身。XML元素类型控制这些资源应该放在R类的什么地方。

尽管这个文件夹里的文件可以任意命名,不过下面使一些比较典型的文件(文件命名的惯例是将元素类型包含在该名称之中):

      array.xml 定义数组

     colors.xml 定义color drawable颜色的字符串值(color string values)。使用Resource.getDrawable()和Resources.getColor()分别获得这些资源。

     dimens.xml定义尺寸值(dimension value)。使用Resources.getDimension()获得这些资源。

     strings.xml定义字符串(string)值。使用Resources.getString()或者Resources.getText()获取这些资源。getText()会保留在UI字符串上应用的丰富的文本样式。

      styles.xml 定义样式(style)对象。

res/xml/

任意的XML文件,在运行时可以通过调用Resources.getXML()读取。

res/raw/

直接复制到设备中的任意文件。它们无需编译,添加到你的应用程序编译产生的压缩文件中。要使用这些资源,可以调用Resources.openRawResource(),参数是资源的ID,即R.raw.somefilename

 

四、各种情况下的读取代码

  • 以下为从Raw文件中读取:

   public String getFromRaw(){ 
            try { 
                InputStreamReader inputReader = new InputStreamReader( getResources().openRawResource(R.raw.test1));
                BufferedReader bufReader = new BufferedReader(inputReader);
                String line="";
                String Result="";
                while((line = bufReader.readLine()) != null)
                    Result += line;
                return Result;
            } catch (Exception e) { 
                e.printStackTrace(); 
            }             
    } 

  • 以下为直接从assets读取

    public String getFromAssets(String fileName){ 
            try { 
                 InputStreamReader inputReader = new InputStreamReader( getResources().getAssets().open(fileName) ); 
                BufferedReader bufReader = new BufferedReader(inputReader);
                String line="";
                String Result="";
                while((line = bufReader.readLine()) != null)
                    Result += line;
                return Result;
            } catch (Exception e) { 
                e.printStackTrace(); 
            }
    } 

 
  • 以下为从SDcard,应用data目录读取

   String path = Environment.getExternalStorageDirectory().toString(); 
    File xmlFlie = new File(path+fileName); 
    InputStream inputStream = new FileInputStream(xmlFlie);

  • 以下为从URL中读取
    很多时候需要解析xml文件都用于客户端与服务器之间的数据交互,比如解析google天气预报信息,或
    自己项目内定的一些XML数据结构,其中通过URL,使用DefaultHTTPClient get请求获取XML文件方法如下

 /**
 * 读取url的xml资源 转成String
 * @param url
 * @return 返回 读取url的xml字符串
 */
public String getStringByUrl(String url) {
    String outputString = "";
    // DefaultHttpClient 
    DefaultHttpClient httpclient = new DefaultHttpClient();
    // HttpGet 
    HttpGet httpget = new HttpGet(url);
    // ResponseHandler 
    ResponseHandler<String> responseHandler = new BasicResponseHandler();
 
    try {
        outputString = httpclient.execute(httpget, responseHandler);
        outputString = new String(outputString.getBytes("ISO-8859-1"), "utf-8");    // 解决中文乱码 
 
        Log.i("HttpClientConnector", "连接成功");
    } catch (Exception e) {
        Log.i("HttpClientConnector", "连接失败");
        e.printStackTrace();
    }
    httpclient.getConnectionManager().shutdown();
    return outputString;
}

 本文用菊子曰发布
原文地址:https://www.cnblogs.com/hbbbs/p/2754247.html