resource是java源代码之外的静台信息。例如layout。resource作为文件存放在res/目录下面,除了res/raw/外,Android会自动解析,例如layout文件,我们不需要自己去解析XML封装。我们之前用过res/layout/,以及res/anim/之前已经用过。
Image:文件存放在res/drawable/,存放镜头的icon。
Raw:res/raw/,程序所需的任意格式的文件,但是系统不会对其进行解析,也既Adroid Framework并不需要的。
String,color,array,dimension:在res/values中,将这些常量和我们的java源代码分离,这样便于程序的国际化或者本地化中。
XML,位于res/xml/,这些静态的XML文件用于保存程序的数据和结构。
String
定义resource
在resource中定义,有利于国际化或者本地化,即便不需要翻译为其他语言,可以很方便去检测或者修改,而无须在程序的各处去寻找,因此这是一种通用的处理方式。Android还支持常用的扩展方式,通过style,可以设置不同的格式。String在res/values/strings.xml中定义,根节点是resources,例如如下:
view plain
<resources>
<string name="quick">The quick brown fox...</string>
<string name="laughs">He who laughs last...</string
<string name="c20_my_name">My name is %1$s %2$s</string>
<string name="c20_rich_text">My name is <b>%1$s</b> <i>%2$s</i></string>
</resources>
如果字符串中包含"和',就需要用\"或者\',如果字符串中只有一个单引号,可以使用"xxxxx 's xxxxxx"的方式,用双引号括起来。
在layout文件中,用@string/element_name,例如@string/quick来引用内容,在java源代码中,用R.string.element_name作为ID,并用getString()来获取,例如getString(R.string.laughs)。
支持string format
例如我们在strngs.xml中定义:<string name="c20_my_name">My name is %1$s %2$s</string>,里面的占位符号可以被变量替换,例如
view plain
String strFormat = getString(R.string.c20_my_name);
String strResult = String.format(strFormat,"Tim","Martin");
那么strResult则为:My name is Tim Martin。
rich Text
如果我们需要rich string,我们还可以通过HTML对格式进行定义,之前学习过的是通过webkit来显示。然而我们也可以在TextView中显示带有Html格式。
例如:<string name="c20_rich_text">My name is <b>%1$s</b> <i>%2$s</i></string>在程序中,我们将内容一个通过textview来显示,一个通过显示html格式的textview,最后一个通过webkit来显示:
view plain
TextView lable = (TextView)findViewById(R.id.c20_lable);
TextView lable2 = (TextView)findViewById(R.id.c20_lable2);
WebView web = (WebView)findViewById(R.id.c20_web);
String strFormat = getString(R.string.c20_rich_text);
String strResult = String.format(strFormat,"Tim","Martin");
String strResult2 = String.format(strFormat,TextUtils.htmlEncode("Tim"),
TextUtils.htmlEncode("Martin"));
/* 上面,strResult和strResult2的结果都是一样的My name is <b>Time<b> <i>Martin</i>
* 所以我们在Android2.2(我的测试版本)并不需要按strResult2的方式。
* 关键是下面setText(Html.fromHtml(strResult)),将一个简单的HTML转换为一个带格式的文本对象
*/
lable.setText(strResult);
lable2.setText(Html.fromHtml(strResult2));
web.loadData(strResult, "text/html", "UTF-8");
图片Picture
图片文件可以是PNG,JPEG,和GIF,推荐使用PNG,不建议使用GIF,文件放置在res/drawable/下,Android有三个文件夹drawable-hdpi/drawable-mdpi/和drawable-ldpi对应不同的尺寸,实际上并没有什么太大的区别。假设文件名为foo.png,则在资源XML文件中名称为@drawable/foo,在Java源代码中该资源的ID则为R.drawable.foo。
例子:将一个png文件app_icon放到drawable中,我放入了drawable-hdpi/中,在Adroid XML文件如下,运行结果如图,中间的书本icon就是我们的ImageButton,只需要通过android:src来指出图片的位置。
view plain
......
<ImageButton android:id="@+id/c20_format2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/app_icon"/>
......
xml文件
xml文件可以用户储存我们的数据,或者作为配置文件等。xml文件可以位于res/xml目录下面,例如我们在该目录下放置一个xml文件words.xml,如下:
view plain
<?xml version="1.0" encoding="utf-8"?>
<ListItems desrciption="Put the entry as the item in Android List">
<Entry value="One" />
<Entry value="Two" />
<Entry value="Three" />
<Entry value="Four" />
<Entry value="Five" />
<Entry value="Six" />
<entry>Hello</entry>
</ListItems>
XmlPullParser可以用于解释xml文件。这里有两种xml的常见格式:<entry>Hello</entry>和<Entry value="Six" />,在Android XML中使用后者,而这种方式在XmlPullParser中处理也非常方便。它的使用方式归纳如下:
XmlPullParser通过next(),依次向下检查
XmlPullParser是事件驱动,如果检测到END_DOCUMENT,应当停止继续检测
XmlPullParser是事件驱动,当检测到START_TAG,可以读出<AAAA bbbb=xxxx c=yyyyy>的内容,其中AAAA可通过getName()来获取,属性的个数,可通过getAttributeCount()获取,属性的名词和内容可分别通过getAttributeName(index)和getAttributeValue(index)来获取。
XmlPullParser是事件驱动,如果是END_TAG,则为</AAAA>,可以通过getName()来获得AAAA的内容
对于<entry>Hello</entry>这种方式,如果要获取中间的数值,则事件为XmlPullParser.TEXT,可通过getText()来获取内容。
由于xml文件可能书写不正确,或者我们在解释的过程中处理不正确,应当使用异常捕获的方式来处理
下面的例子,我们将上述的words.xml分析处理,将Entry数值作为listActivity的每个item的内容。
view plain
/* 1. XmlPullParser通过next(),依次向下检查
* 2. XmlPullParser是事件驱动,如果检测到 END_DOCUMENT,应当停止继续检测
* 3. XmlPullParser是事件驱动,当检测到START_TAG,可以读出<AAAA bbbb=xxxx c=yyyyy>的内容,其中AAAA可通过getName()来获取,属性的个数,可通过getAttributeCount()获取,属性的名词和内容可分别通过getAttributeName(index)和getAttributeValue(index)来获取。
* 4. XmlPullParser 是事件驱动,如果是END_TAG,则为</AAAA>,可以通过getName()来获得AAAA的内容
* 5. 对于<entry>Hello</entry>这种方式,如果要获取中间的数值,则事件为XmlPullParser.TEXT, 可通过getText()来获取内容。
* 6. 由于xml文件可能书写不正确,或者我们在解释的过程中处理不正确,应当使用异常捕获的方式来处理
*/
public class Chapter20Test3 extends ListActivity{
private ArrayList<String> items = new ArrayList<String>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*步骤1:进行特定xml文件words的解析,对应第6点,应采用异常捕获防止程序出错*/
try{
/* 步骤2:获取xml文件,并给给出XmlPullParser对象*/
XmlPullParser xpp = getResources().getXml(R.xml.words);
/* 步骤3:通过循环,逐步解析XML,直至xml文件结束,对应第1点和第2点*/
while(xpp.getEventType()!=XmlPullParser.END_DOCUMENT){
/* 步骤4:获取目标ListItems的解析,并将之用method:ListItems来处理,对应第3点 */
if(xpp.getEventType() == XmlPullParser.START_TAG){
if(xpp.getName().equals("ListItems")){
getItems(xpp);
}
}
xpp.next();
}
}catch(Throwable t){
Toast.makeText(this, "Failed:" + t.toString(), 2000).show();
}
setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items));
}
/* 解析<ListItems ... >.... </Listitem>的内容,获取每个entry的value的值,注意对异常的处理*/
private void getItems(XmlPullParser xpp) throws Throwable{
while(true){
xpp.next();
/*<ListItems> ...</ListItems>的内容已经检索完毕,或者文件结束,都退出处理*/
if((xpp.getEventType() == XmlPullParser.END_TAG && xpp.getName().equals("ListItems"))
|| xpp.getEventType() == XmlPullParser.END_DOCUMENT)
break;
if(xpp.getEventType()==XmlPullParser.START_TAG) {
/*观测点:对第3点的处理,读出属性的名字和数值*/
if(xpp.getName().equals("Entry")){
for(int i = 0; i < xpp.getAttributeCount() ; i ++){
if(xpp.getAttributeName(i).equals("value")){
items.add(xpp.getAttributeValue(i));
}
}
}
/*观测点:对第5点的处理,处理<name>value</name>*/
if(xpp.getName().equals("entry")){
xpp.next();
if(xpp.getEventType()==XmlPullParser.TEXT)
items.add(xpp.getText());
}
}
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(this, items.get(position), Toast.LENGTH_LONG).show();
}
}
Image:文件存放在res/drawable/,存放镜头的icon。
Raw:res/raw/,程序所需的任意格式的文件,但是系统不会对其进行解析,也既Adroid Framework并不需要的。
String,color,array,dimension:在res/values中,将这些常量和我们的java源代码分离,这样便于程序的国际化或者本地化中。
XML,位于res/xml/,这些静态的XML文件用于保存程序的数据和结构。
String
定义resource
在resource中定义,有利于国际化或者本地化,即便不需要翻译为其他语言,可以很方便去检测或者修改,而无须在程序的各处去寻找,因此这是一种通用的处理方式。Android还支持常用的扩展方式,通过style,可以设置不同的格式。String在res/values/strings.xml中定义,根节点是resources,例如如下:
view plain
<resources>
<string name="quick">The quick brown fox...</string>
<string name="laughs">He who laughs last...</string
<string name="c20_my_name">My name is %1$s %2$s</string>
<string name="c20_rich_text">My name is <b>%1$s</b> <i>%2$s</i></string>
</resources>
如果字符串中包含"和',就需要用\"或者\',如果字符串中只有一个单引号,可以使用"xxxxx 's xxxxxx"的方式,用双引号括起来。
在layout文件中,用@string/element_name,例如@string/quick来引用内容,在java源代码中,用R.string.element_name作为ID,并用getString()来获取,例如getString(R.string.laughs)。
支持string format
例如我们在strngs.xml中定义:<string name="c20_my_name">My name is %1$s %2$s</string>,里面的占位符号可以被变量替换,例如
view plain
String strFormat = getString(R.string.c20_my_name);
String strResult = String.format(strFormat,"Tim","Martin");
那么strResult则为:My name is Tim Martin。
rich Text
如果我们需要rich string,我们还可以通过HTML对格式进行定义,之前学习过的是通过webkit来显示。然而我们也可以在TextView中显示带有Html格式。
例如:<string name="c20_rich_text">My name is <b>%1$s</b> <i>%2$s</i></string>在程序中,我们将内容一个通过textview来显示,一个通过显示html格式的textview,最后一个通过webkit来显示:
view plain
TextView lable = (TextView)findViewById(R.id.c20_lable);
TextView lable2 = (TextView)findViewById(R.id.c20_lable2);
WebView web = (WebView)findViewById(R.id.c20_web);
String strFormat = getString(R.string.c20_rich_text);
String strResult = String.format(strFormat,"Tim","Martin");
String strResult2 = String.format(strFormat,TextUtils.htmlEncode("Tim"),
TextUtils.htmlEncode("Martin"));
/* 上面,strResult和strResult2的结果都是一样的My name is <b>Time<b> <i>Martin</i>
* 所以我们在Android2.2(我的测试版本)并不需要按strResult2的方式。
* 关键是下面setText(Html.fromHtml(strResult)),将一个简单的HTML转换为一个带格式的文本对象
*/
lable.setText(strResult);
lable2.setText(Html.fromHtml(strResult2));
web.loadData(strResult, "text/html", "UTF-8");
图片Picture
图片文件可以是PNG,JPEG,和GIF,推荐使用PNG,不建议使用GIF,文件放置在res/drawable/下,Android有三个文件夹drawable-hdpi/drawable-mdpi/和drawable-ldpi对应不同的尺寸,实际上并没有什么太大的区别。假设文件名为foo.png,则在资源XML文件中名称为@drawable/foo,在Java源代码中该资源的ID则为R.drawable.foo。
例子:将一个png文件app_icon放到drawable中,我放入了drawable-hdpi/中,在Adroid XML文件如下,运行结果如图,中间的书本icon就是我们的ImageButton,只需要通过android:src来指出图片的位置。
view plain
......
<ImageButton android:id="@+id/c20_format2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/app_icon"/>
......
xml文件
xml文件可以用户储存我们的数据,或者作为配置文件等。xml文件可以位于res/xml目录下面,例如我们在该目录下放置一个xml文件words.xml,如下:
view plain
<?xml version="1.0" encoding="utf-8"?>
<ListItems desrciption="Put the entry as the item in Android List">
<Entry value="One" />
<Entry value="Two" />
<Entry value="Three" />
<Entry value="Four" />
<Entry value="Five" />
<Entry value="Six" />
<entry>Hello</entry>
</ListItems>
XmlPullParser可以用于解释xml文件。这里有两种xml的常见格式:<entry>Hello</entry>和<Entry value="Six" />,在Android XML中使用后者,而这种方式在XmlPullParser中处理也非常方便。它的使用方式归纳如下:
XmlPullParser通过next(),依次向下检查
XmlPullParser是事件驱动,如果检测到END_DOCUMENT,应当停止继续检测
XmlPullParser是事件驱动,当检测到START_TAG,可以读出<AAAA bbbb=xxxx c=yyyyy>的内容,其中AAAA可通过getName()来获取,属性的个数,可通过getAttributeCount()获取,属性的名词和内容可分别通过getAttributeName(index)和getAttributeValue(index)来获取。
XmlPullParser是事件驱动,如果是END_TAG,则为</AAAA>,可以通过getName()来获得AAAA的内容
对于<entry>Hello</entry>这种方式,如果要获取中间的数值,则事件为XmlPullParser.TEXT,可通过getText()来获取内容。
由于xml文件可能书写不正确,或者我们在解释的过程中处理不正确,应当使用异常捕获的方式来处理
下面的例子,我们将上述的words.xml分析处理,将Entry数值作为listActivity的每个item的内容。
view plain
/* 1. XmlPullParser通过next(),依次向下检查
* 2. XmlPullParser是事件驱动,如果检测到 END_DOCUMENT,应当停止继续检测
* 3. XmlPullParser是事件驱动,当检测到START_TAG,可以读出<AAAA bbbb=xxxx c=yyyyy>的内容,其中AAAA可通过getName()来获取,属性的个数,可通过getAttributeCount()获取,属性的名词和内容可分别通过getAttributeName(index)和getAttributeValue(index)来获取。
* 4. XmlPullParser 是事件驱动,如果是END_TAG,则为</AAAA>,可以通过getName()来获得AAAA的内容
* 5. 对于<entry>Hello</entry>这种方式,如果要获取中间的数值,则事件为XmlPullParser.TEXT, 可通过getText()来获取内容。
* 6. 由于xml文件可能书写不正确,或者我们在解释的过程中处理不正确,应当使用异常捕获的方式来处理
*/
public class Chapter20Test3 extends ListActivity{
private ArrayList<String> items = new ArrayList<String>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/*步骤1:进行特定xml文件words的解析,对应第6点,应采用异常捕获防止程序出错*/
try{
/* 步骤2:获取xml文件,并给给出XmlPullParser对象*/
XmlPullParser xpp = getResources().getXml(R.xml.words);
/* 步骤3:通过循环,逐步解析XML,直至xml文件结束,对应第1点和第2点*/
while(xpp.getEventType()!=XmlPullParser.END_DOCUMENT){
/* 步骤4:获取目标ListItems的解析,并将之用method:ListItems来处理,对应第3点 */
if(xpp.getEventType() == XmlPullParser.START_TAG){
if(xpp.getName().equals("ListItems")){
getItems(xpp);
}
}
xpp.next();
}
}catch(Throwable t){
Toast.makeText(this, "Failed:" + t.toString(), 2000).show();
}
setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items));
}
/* 解析<ListItems ... >.... </Listitem>的内容,获取每个entry的value的值,注意对异常的处理*/
private void getItems(XmlPullParser xpp) throws Throwable{
while(true){
xpp.next();
/*<ListItems> ...</ListItems>的内容已经检索完毕,或者文件结束,都退出处理*/
if((xpp.getEventType() == XmlPullParser.END_TAG && xpp.getName().equals("ListItems"))
|| xpp.getEventType() == XmlPullParser.END_DOCUMENT)
break;
if(xpp.getEventType()==XmlPullParser.START_TAG) {
/*观测点:对第3点的处理,读出属性的名字和数值*/
if(xpp.getName().equals("Entry")){
for(int i = 0; i < xpp.getAttributeCount() ; i ++){
if(xpp.getAttributeName(i).equals("value")){
items.add(xpp.getAttributeValue(i));
}
}
}
/*观测点:对第5点的处理,处理<name>value</name>*/
if(xpp.getName().equals("entry")){
xpp.next();
if(xpp.getEventType()==XmlPullParser.TEXT)
items.add(xpp.getText());
}
}
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(this, items.get(position), Toast.LENGTH_LONG).show();
}
}