安卓成长记(八)
第六章,安卓的应用资源
资源一般被放在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();
}
}
关于函数什么的,可以看视频那一节。这里的解析并不全。