安卓成长记(八)

第六章,安卓的应用资源

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

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

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

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

字符串资源:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">颜色尺寸资源/string>
    <string name="c1">F00</string>
    <string name="c2">0F0</string>
    <string name="c3">00F</string>
    <string name="c4">0FF</string>
    <string name="c5">F0F</string>
    <string name="c6">FF0</string>
    <string name="c7">07F</string>
    <string name="c8">70F</string>
    <string name="c9">F70</string>
</resources>

xml文件头:

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

颜色资源

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="c1">#F00</color>
    <color name="c2">#0F0</color>
    <color name="c3">#00F</color>
    <color name="c4">#0FF</color>
    <color name="c5">#F0F</color>
    <color name="c6">#FF0</color>
    <color name="c7">#07F</color>
    <color name="c8">#70F</color>
    <color name="c9">#F70</color>
</resources>

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

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="spacing">8dp</dimen>
    <dimen name="cell_width">60dp</dimen>
    <dimen name="cell_height">66dp</dimen>
    <dimen name="title_font_size">18sp</dimen>
</resources>

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

我想是的。下面是integer元素

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="font_size">20</integer>
</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

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


    <string-array name="string_arr">
        <item>@string/c1</item>
        <item>@string/c2</item>
        <item>@string/c3</item>
        <item>@string/c4</item>
        <item>@string/c5</item>
        <item>@string/c6</item>
        <item>@string/c7</item>
        <item>@string/c8</item>
        <item>@string/c9</item>
    </string-array>

    <string-array name="books">
        <item>哈哈</item>
        <item>Ajax</item>
        <item>Android</item>
    </string-array>
</resources>

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

<?xml version="1.0" encoding="UTF-8"?>
<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文件如下:

<!-- 使用StateListDrawable资源 -->
    <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

<?xml version="1.0" encoding="UTF-8"?>
<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();
                }
            }

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