安卓成长记(八)

安卓成长记(八)

第六章,安卓的应用资源

资源一般被放在res目录之下。
asserts也用于存放资源,一般来说asserts存放的是无法直接访问的原生资源,程序需要通过AssertManager以二进制流的方式读取资源。

/res/目录下的资源都会在R文件中建立索引。

res目录之下有子文件夹,有的子文件夹不是必须的。

/res/animator存放定义属性动画的xml文件
/res/anim 存放定义补间动画的xml文件
/res/color 存放定义不同状态下的颜色列表的xml文件(what?)
/res/raw 存放原生资源
/res/value 存放字符串,整数值,颜色值,数组,尺寸等。

字符串资源:

version="1.0" encoding="utf-8"?>

    <string name="app_name">颜色尺寸资源/string>
    <string name="c1">F00string>
    <string name="c2">0F0string>
    <string name="c3">00Fstring>
    <string name="c4">0FFstring>
    <string name="c5">F0Fstring>
    <string name="c6">FF0string>
    <string name="c7">07Fstring>
    <string name="c8">70Fstring>
    <string name="c9">F70string>

xml文件头:

< ?xml version=”1.0” encoding=”utf-8”?>
文件头也很简单么
注意根元素是< resources>
对于条目:
< string name=”c2”>0FF< /string>
name是这个string条目的名字,中间夹得是值。

颜色资源

颜色资源也在values文件夹下面。
并且跟元素也是resource


<resources>
    <color name="c1">#F00color>
    <color name="c2">#0F0color>
    <color name="c3">#00Fcolor>
    <color name="c4">#0FFcolor>
    <color name="c5">#F0Fcolor>
    <color name="c6">#FF0color>
    <color name="c7">#07Fcolor>
    <color name="c8">#70Fcolor>
    <color name="c9">#F70color>
resources>

< color name=”c1”>#F00< /color>
条目变成了color而已

尺寸元素:也是位于value文件夹下,根元素也是resource


<resources>
    <dimen name="spacing">8dpdimen>
    <dimen name="cell_width">60dpdimen>
    <dimen name="cell_height">66dpdimen>
    <dimen name="title_font_size">18spdimen>
resources>

元素是dimen。是不是在value文件夹下的都是resource根元素

我想是的。下面是integer元素


<resources>
    <integer name="font_size">20integer>
resources>

在value文件夹下,根元素也是resouce。

注意下面这一种,在java文件中访问实际资源的方法:

@Override
            public View getView(int position
                    , View convertView, ViewGroup parent)
            {
                TextView text = new TextView(MainActivity.this);
                //这个是获取资源,通过context的getResource()方法获取到res资源
                //之后通过这个res去找到实际资源
                //要我说就是换了个访问的方法而已。res一个那么大的对象,包含了种种资源
                //那使用起来跟R文件有什么区别么……
                //系统里面有什么资源在res对象里面都能找到
                Resources res = MainActivity.this.getResources();
                // 使用尺度资源来设置文本框的高度、宽度
                text.setWidth((int) res.getDimension(R.dimen.cell_width));
                text.setHeight((int) res.getDimension(R.dimen.cell_height));
                // 使用字符串资源设置文本框的内容
                text.setText(textIds[position]);
                // 使用颜色资源来设置文本框的背景色
                text.setBackgroundResource(colorIds[position]);
                text.setTextSize(20);
                text.setTextSize(getResources()
                    .getInteger(R.integer.font_size));
                return text;
            }

数组资源

数组资源也是在value文件夹下,因此根元素估计也是resource


名字和类型放在这一行先说明了,array,name是数组的名字
下面的都是条目,这个条目更有意思,条目是引用了color的资源。
想想也没错啊,人家在xml文件里面,就按着xml文件的访问方法啊
    name="plain_arr">
        <item>@color/c1item>
        <item>@color/c2item>
        <item>@color/c3item>
        <item>@color/c4item>
        <item>@color/c5item>
        <item>@color/c6item>
        <item>@color/c7item>
        <item>@color/c8item>
        <item>@color/c9item>
    
这个是字符串数组资源
string-array name="我是字符串数组的名字"
很重要的一种用法是在ListView的
android:ntries="@string-array/我是字符串数组的名字"
不过好像不是上面那种用的,不带string才对
android:entries="@array/我是字符串数组的名字"
因为估计是数组,就都用array表示访问。


    <string-array name="string_arr">
        <item>@string/c1item>
        <item>@string/c2item>
        <item>@string/c3item>
        <item>@string/c4item>
        <item>@string/c5item>
        <item>@string/c6item>
        <item>@string/c7item>
        <item>@string/c8item>
        <item>@string/c9item>
    string-array>

    <string-array name="books">
        <item>哈哈item>
        <item>Ajaxitem>
        <item>Androiditem>
    string-array>

下面介绍Drawable对象
StateListDrawable对象:能根据状态切换样式的drawable对象


<selector xmlns:android="http://schemas.android.com/apk/res/android">
    
    <item android:state_focused="true"
          android:color="#f44"/>
    
    <item android:state_focused="false"
          android:color="#ccf"/>
selector>

item android:state_focused=”true”后边这个属性是能该的。focused只是一个状态
注意它的根元素是selector

另外指定的是android:color=”#ccf”属性,那引用的话也是color资源才对

引用的xml文件如下:


    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@drawable/my_image"/>
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@drawable/my_image"/>

你在selector里面定义的是color资源,那就应当用在需要color资源的时候。

其实很重要的用法就是用在文本框的高亮状态,上面那个就是:
android:textColor=”@drawable/my_image”
这样文本框自己就会根据不同的状态变换颜色,很神奇吧!

shapeDrawable资源

这个就是用于定义一个文本框的外观什么的,或者是按钮的样子,反正很丑也没人用

根元素是shape


<shape xmlns:android="http://schemas.android.com/apk/res/android"
//无非就是这里指定一个“模子”,是在什么形状上面做改动。
    android:shape="rectangle">
    
    <solid android:color="#fff"/>
    
    <padding android:left="7dp"
             android:top="7dp"
             android:right="7dp"
             android:bottom="7dp" />
    
    <stroke android:width="3dip" android:color="#ff0" />
shape>

到时候参考一下就行了。

xml文件

这个的解析是比较重要的。从网络上下载的东西什么的,很多都是xml资源

注意在原始的工程里没有xml文件夹,要手动建立xml文件夹

一般是/res/xml这样的

在java中机这样访问:R.xml.< name>

通过如下的方式获取xml资源:

// XmlResourceParser是XmlPullParser的子类
XmlResourceParser xrp = getResources().getXml(R.xml.books);
是不是感觉有点儿问题?
getResources().getXml(R.xml.books)这一个函数下去,怎么想着也应该是返回一个xml文件对不对?
你getXml资源了啊!
但是仔细想想,返回来一个xml文件也没法用啊,你又不知道里面是啥结构
于是只能返回一个解析器,就跟cursor一样,返回来的东西,你可以“曲线救国”,用另一个东西用。

于是要新建一个解析器XmlResourceParser xrp把返回来的对象收留住。

另外注意那条注释:XmlResourceParser是XmlPullParser的子类

其实用XmlPullParser更好,以来更明确,而来安卓确实推荐使用XmlPullParser去解析xml文件。

反正也很简单,获取了这个啥都能干的XmlPullParser,就能调用里面的方法获得xml的内容了。

public void onClick(View arg0)
            {
                // 根据XML资源的ID获取解析该资源的解析器
                // XmlResourceParser是XmlPullParser的子类
                //首先根据名字获取了资源,xrp这个对形象是个包裹了解析内容的解析器
                XmlResourceParser xrp = getResources().getXml(R.xml.books);
                try
                    {//这个就是string构造器了
                    StringBuilder sb = new StringBuilder("");
                    // 还没有到XML文档的结尾处,getEventType是返回当前节点的类型。
                    while (xrp.getEventType()
                        != XmlResourceParser.END_DOCUMENT)
                    {
                        // 如果遇到了开始标签
                        if (xrp.getEventType() ==
                            XmlResourceParser.START_TAG)
                        {
                            // 获取该标签的标签名
                            String tagName = xrp.getName();
                            // 如果遇到book标签
                            if (tagName.equals("book"))
                            {
                                // 根据属性名来获取属性值
                                String bookName = xrp
                                    .getAttributeValue(null, "price");
                                sb.append("价格:");
                                sb.append(bookName);
                                // 根据属性索引来获取属性值
                                String bookPrice = xrp
                                    .getAttributeValue(1);
                                sb.append(" 出版日期:");
                                sb.append(bookPrice);
                                sb.append(" 书名:");
                                // 获取文本节点的值
                                sb.append(xrp.nextText());
                            }
                            sb.append("\n");
                        }
                        // 获取解析器的下一个事件
                        xrp.next(); // ①
                    }
                    EditText show = (EditText) findViewById(R.id.show);
                    show.setText(sb.toString());
                }
                catch (XmlPullParserException e)
                {
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }

关于函数什么的,可以看视频那一节。这里的解析并不全。

你可能感兴趣的:(安卓成长记(八))