任意的XML资源文件
Android还支持任意的XML资源文件。这就让普通XML文件扩充了三个资源文件的特性。第一,可以通过产生的ID来快速引用;第二,可以本地化这些XML文件;第三,可以通过编译使得这些XML文件效率更高地存储在设备上。
需要用这种方式读取的XML文件存储在/res/xml子目录下。这里有个例子/res/xml/test.xml:
<rootelem1>
<subelem1>
Hello World from an xml sub element
<sublem1>
</rootelem1>
和其他Android XML资源一样,AAPT在把这个XML文件放进应用包之前会对它进行编译。你需要使用XmlPullParser的一个实例来解析这些文件。你可以使用下面的代码段来获取
XmlPullParser的实例:
Resources res = activity.getResources();
XmlResourceParser xpp = res.getXml(R.xml.test);
返回的XmlResourceParser是XmlPullParser的一个实例,继承自java.util.AttributeSet。表3-18显示了一个读取test.xml文件更加详细的代码段。
表3-18 使用XmlPullParser
private String getEventsFromAnXMLFile(Activity activity)
throws XmlPullParserException, IOException
{
StringBuffer sb = new StringBuffer();
Resources res = activity.getResources();
XmlResourceParser xpp = res.getXml(R.xml.test);
xpp.next();
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT)
{
if(eventType == XmlPullParser.START_DOCUMENT)
{
sb.append("******Start document");
}
else if(eventType == XmlPullParser.START_TAG)
{
sb.append("nStart tag "+xpp.getName());
}
else if(eventType == XmlPullParser.END_TAG)
{
sb.append("nEnd tag "+xpp.getName());
}
else if(eventType == XmlPullParser.TEXT)
{
sb.append("nText "+xpp.getText());
}
eventType = xpp.next();
}//eof-while
sb.append("n******End document");
return sb.toString();
}//eof-function
通过上面的代码,你可以看到如何获取XmlPullParser,如何使用XmlPullParser来定位XML文件里的元素,以及如何使用XmlPullParser的其他方法来获取XML元素的详细信息。如果你想运行这段代码,你必须如之前所述建立一个XML文件,在菜单或者按钮的click中调用getEventsFromAnXMLFile函数。它会返回一个字符串,你可以使用Log.d调试函数将它输出到日志流里面。
使用Raw Resources(原始文件)
Android还支持原始资源文件。这些文件在/res/raw目录下,是一些音频、视频或者文本文件。这些文件需要本地化和用资源ID来引用。和在/res/xml目录下XML文件不同的是,这些文件不会被编译,而是被原封不动的搬进应用程序包。不管怎样,它们在R.java里面也产生识别器。如果你有/raw/test.txt,那么你可以通过下面代码读取test.txt:
表3-19 读取Raw Resource
String getStringFromRawFile(Activity activity)
{
Resources r = activity.getResources();
InputStream is = r.openRawResource(R.raw.test);
String myText = convertStreamToString(is);
is.close();
return myText;
}
String convertStreamToString(InputStream is)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i = is.read();
while (i != -1)
{
baos.write(i);
使用Assets
Android还有/assets目录,和/res目录平级。在/assets目录下的文件不会在R.java里产生ID。你必须通过文件路径来读取它们。这个路径是以/assets开始的相对路径。你需要使用AssetManager类来获得这些文件:
//这段代码未包含异常处理文件
String getStringFromAssetFile(Activity activity)
{
AssetManager am = activity.getAssets();
InputStream is = am.open("test.txt");
String s = convertStreamToString(is);
is.close();
return s;
}