• 【转】Pro Android学习笔记(四):了解Android资源(下)


    处理任意的XML文件

    自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象。下面是xml文件的例子:

    <rootname="tom"><--也可以是<root>,本次采用带参数的方式作为实验--> 
       <leaf>Hello from an elementtest.</leaf>
       <leaf>Hello World!</leaf>
       <cornersradius="13dp"/>
    </root>

    通过javacode对xml文件进行逐层解析,代码如下:

    try{  //防止在解析过程中,因xml文件书写或解析分析不匹配等原因造成的异常
       XmlPullParser xpp =getResources().getXml(R.xml.rt_test);
     //获取XML资源的对象
                
       int eventType = xpp.next();  //相当于xpp.next(); int eventType =xpp.getEventType(),而next()直接返回类型
       while(eventType != XmlPullParser.END_DOCUMENT){ //根据类型不同进行相应处理
           switch(eventType){ 
           caseXmlPullParser.START_DOCUMENT
               Log.d("xml","***************start****************"); 
               break; 
           caseXmlPullParser.START_TAG
               int count = xpp.getAttributeCount(); 
               Log.d("xml","starttap: " + xpp.getName() + "attribute number " +count); 
               for(int i = 0 ; i < count ; i ++){ //此处处理<xxxx yy=zz….>中yy=zz的参数部分,要注意xml是允许这样编写,除非确定自定义的XML的schema中不纯正此方式
                   Log.d("xml","    Attribute " + i + " : " + xpp.getAttributeName(i) +" = " +xpp.getAttributeValue(i)); 
               } 
               break; 
           caseXmlPullParser.END_TAG
               Log.d("xml","endtap: " + xpp.getName()); 
               break; 
           case XmlPullParser.TEXT
               Log.d("xml"," text: " + xpp.getText()); 
               break; 
           default: 
               Log.d("xml","eventType= " + eventType); 
               break; 
           } 
          eventType = xpp.next(); 
       } 
       Log.d("xml","***************end****************"); 
    }catch(Throwable t){ 
       Log.e("xml","testXMLget exception t : " +t.getMessage()); 
    }

    更详细的代码说明可以阅读Android学习笔记(三八):资源resource(上)、XML解析(XmlPullParser)。运行结果如下:

    处理Raw资源

    raw资源位于res/raw目录下,和其他的资源不同,不经过编译就打包到应用的apk中。raw文件可以为音频、视频等任何格式的文件。读取是和java的文件读取一直,不同的是通过R.raw.filename来获取。

    protected void testRaw(){ 
       try{ //io读取,对异常的获取
           InputStream is =getResources().openRawResource(R.raw.rt_test); //获取raw资源
           readTextFile(is);
           is.close();
       }catch(Throwable t){
           Log.e("raw","testRaw error : " + t.getMessage());
        }
    }

    private void readTextFile(InputStream is) throwsIOException{
       ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int ch =is.read();
        while(ch !=-1){
           baos.write(ch);
           ch =is.read();           
        }
       Log.d("raw",baos.toString());
       //Log.d("raw",newString(baos.toByteArray(),"GB2312"));
    }

    处理Asset资源

    asset资源是位于/assets目录下,该目录于/res目录平衡,即不在/res下面,所以不在R.java中形成相关的ID,不能通过ID来获取asset资源。/assets是应用的用户目录,类似linux用户中的~/目录。我们在改目录下放置文本文件tv_test.txt。下面是读取的代码。

    protected void testAssets(){ 
        try{
           AssetManager am = getAssets(); //通过AssetManager来获取/assets目录下的文件
           InputStream is =am.open("vt_test.txt");//不使用ID,直接通过文件名来获取,又如”subbir/vt_test2.txt”
           readTextFile(is);
           is.close();
       }catch(Throwable t){
           Log.e("asset","testAsset Resource error : " + t.getMessage());
        }
    }

    注意,getResource()和getAsset()都是activity下的方法,如activity.getResource()。

    资源和配置的变更

    资源有助于本地化,包括适配语言,横/竖屏、屏尺寸等等。在res中出了之前介绍的default文件夹,还可以有基于条件适配的文件夹,存放相同名字的XML文件,这些文件夹在R.java中具有相同的ID。Android根据实际情况,选择合适文件夹中的XML描述。例如:

    eslayoutmain_layout.xml
    eslayout-portmain_layout.xml
    eslayout-landmain_layout.xml

    当设备为竖屏时,则优先选择layout-port,其次为layout。带有条件的文件夹成为alternate resources,所带的条件,如上例子中的-port成为configuration qualifiers。这种带适配条件文件夹的格式为:缺省资源文件夹名-条件1[-条件2[-条件N...]]。具体的configuration qualifiers可以在:http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources中查找,下面列举部分:

    mccAAA: AAA is the mobile country code.
    mncAAA: AAA is the carrier/network code.
    en-rUS: Language and region.
    sw<N>dp, w<N>dp, h<N>dp: Smallest width, available width, available height (since API 13).
    small, normal, large, xlarge: Screen size.
    long, notlong: Screen type.
    port, land: Portrait or landscape.
    car, desk: Type of docking.
    night, notnight: Night or day.
    ldpi, mdpi, hdpi, xhdpi, nodpi, tvdpi: Screen density.
    notouch, stylus, finger: Kind of screen.
    keysexposed, keyssoft, keyshidden: Kind of keyboard.
    nokeys, qwerty, 12key: Number of keys.
    navexposed, navhidden: Navigation keys hidden or exposed.
    nonav, dpad, trackball, wheel: Type of navigation device.
    v3, v4, v7: API level.

    这些条件是有优先级别的,在缺省资源文件夹名-条件1[-条件2[-条件N...]]中条件1的优先级别必须高于条件2的优先级别,同理条件2的优先级别必须高于条件3的优先级别。条件级别的高低是Android预先设定的,上面列举的各条件的优先级别就是从高到低。例如有以下的几个文件夹:/res/values,/res/values-en,/res/values-en-rUS,/res/values-port,/res/values-en-port。对于语言为美国英语(en-rUS)的竖屏情况下,Android通过ID查找资源的顺序为/res/values-en-rUS,/res/values-en-port,/res/values-en,/res/values-port,/res/values。

    相关链接: 我的Android开发相关文章

    转自http://blog.csdn.net/flowingflying/article/details/9149527

  • 相关阅读:
    M1阶段的开发过程的一些反思
    Alpha版本发布说明
    Alpha版本BUG BASH
    Notes of Daily Scrum Meeting(11.19)
    Notes of Daily Scrum Meeting(11.17)
    Notes of Daily Scrum Meeting(11.15)
    Notes of Daily Scrum Meeting(11.14)
    flask_sqlalchemy介绍
    SQLAlchemy 简单笔记
    Python-3.6 安装pycrypto 2.6
  • 原文地址:https://www.cnblogs.com/blongfree/p/5047528.html
Copyright © 2020-2023  润新知