这篇笔记主要讲述下android的一些主要资源类型。下面一张表概括了android中的关键资源类型及其用途:
资源类型 | 位置 | 说明 |
颜色 | /res/values/any-file | 表示指向颜色编码的颜色标识符。这些资源ID在R.java中公开为R.color.*。文件中的XML节点为/resources/color |
字符串 | /res/values/any-file | 表示字符串资源。除了简单字符串,字符串资源海支持java格式的字符串和原始HTML。这些资源ID在R.java中公开为R.string.*。文件中XML节点为/resources/string |
字符串数组 | /res/values/any-file | 表示一个做为字符串数组的资源。这些资源ID在R.java中公开为R.array.*。文件中的XML节点为/resources/string-array |
复数(plural) | /res/values/any-file | 根据数量值表示一个合适的字符串集合。数量是一个数字,在各种语言中,编写语句的方式取决于你引用了0个、1个或多个对象。这些资源ID在R.java中公开为R.plural.*。文件中的XML节点为/resources/plurals |
尺寸 | /res/values/any-file | 表示android中各种元素或试图的尺寸或大小。支持像素、英寸、毫米与密度无关的像素(density independent pixel)以及与比例无关的像素(scale independent pixel)。这些资源ID在R.java中公开为R.dimen.*。文件中的XML节点为/resources/dimen |
图像 | /res/drawable/multiple-files | 表示图像资源。支持的图像格式包括.jpg、.gif、.png等。每个图像位于独立的文件中,并根据文件名获得自己的ID。这些资源ID在R.java中公开为R.drawable.*。图像支持还包括一种名为可拉伸图像的图像类型,这种类型支持拉伸图像的一部分,而其他部分保持不变。这种可拉伸图像也称为9-patch文件(.9.png) |
色图 | /res/values/any-file以及/res/drawable/multiple-files | 表示用作视图背景的矩形色块或普通图形对象,比如位图。可以使用色图做为背景,而无需指定单个彩色位图。在java中,这相当于创建一个彩色矩形病将其设置为视图背景 values子目录中的<drawable>值标记支持色图。这些资源ID在R.java中公开为R.drawable.*。文件中的XML节点为/resources/drawable android还通过在/res/drawable中放置包含根XML标记<shape>的XML文件,支持圆角矩形和渐变矩形。这些资源ID也在R.java中公开为R.drawable.*。在这种情况下,每个文件名会转换为一个独立的图形对象ID |
任意XML文件 | /res/xml/*.xml | android允许将任意XML文件用作资源。这些文件使用AAPT编译器编译。这些资源ID在R.java中公开为R.xml.*。 |
任意原始资源 | /res/raw/*.* | android支持此目录下的任意未编译的二进制文件或文本文件。每个文件都会获得一个唯一的资源ID。这些资源ID在R.java中公开为R.raw.* |
任意原始资产 | /assets/*.*/*.* | android支持/assets子目录下任意子目录中的任意文件。这些文件不是真正的资源,知识原始文件。与/res资源子目录不同,这个子目录支持任意深度的子目录。这些文件不会生成任何资源ID,必须使用以/assets开始(不包含它)的相对路径名 |
下面主要看看字符串资源及字符串数组资源用法:
1.字符串资源
大部分UI框架都支持字符串资源,但android通过R.java迅速将ID与字符串资源关联,所以在android中将字符串用作资源将简单很多。下面看几种XML资源文件中的字符串资源:普通字符串,引用字符串,HTML字符串及可替换字符串。在/res/values/string.xml(文中使用的所有工程文件是由eclipse默认方式建立android工程时自动生成)中resources子节点下添加代码如下:
<resources>
<string name="simple_string">simple string</string>
<string name="quoted_string">"quoted 'xyz' string"</string>
<string name="double_quoted_string">\"double quotes \"</string>
<string name="java_format_string">hello %2$s Java format string. %1$s again</string>
<string name="tagged_string">Hello <b><i>Slanted Android</i></b>, You are bold</string>
</resources>
第一种使用方法,JAVA源码中直接调用,在MainActivity.java文件中代码清单如下:
TextView textView = new Textview(this);
setContentView(textView);
String simpleString = this.getString(R.string.simple_string);
textView.setText(simpleString);
String quotedString = this.getString(R.string.quoted_string);
textView.setText(quotedString);
String doubleQuotedString = this.getString(R.string.double_quoted_string);
textView.setText(doubleQuotedString);
String javaFormatString = this.getString(R.string.java_format_string);
String substitutedString = String.format(javaFormatString, "Hello", "Android");
textView.setText(substitutedString);
String htmlTaggedString = this.getString(R.string.tagged_string);
Spanned textSpan = android.text.Html.fromHtml(htmlTaggedString);
textView.setText(textSpan);
因为这里没有使用到布局文件,所以只能看到最后一个字串,可以屏蔽以后逐个打开来一一查看效果。
第2种方法使用布局文件资源,然后在java代码中调用布局文件资源即可。很庆幸的是HTML格式文件在布局资源里面可以自动解析,TextView会自动确认此字符串是HTML字符串,并遵守它的格式。使用布局资源在/res/layout/activity_main.xml文件中添加代码清单如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
。。。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/simple_string"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/quoted_string" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/double_quoted_string" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/java_format_string" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tagged_string" />
</LinearLayout>
在JAVA源码中调用setContentView(R.layout.activity_main);即可获得此布局View,不过java格式的字串无法正确显示,目前尚未找到方法(只能使用前面的直接调用的方式),后续再补充。
2.字符串数组
可以指定一个字符串数组做为/res/values目录(此目录下资源文件不支持子目录)下所有文件中的资源,XML节点使用string-array,此节点为resources的子节点,跟string资源节点一样。在string.xml文件中添加代码清单如下:
<resources xmlns="http://schemas.android.com/apk/res/android">
。。。
<string name="hello_world">Hello world!</string>
<string-array name="test_array">
<item>one</item>
<item>two</item>
<item>three</item>
</string-array>
</resources>
添加了此字符串数组资源以后,利用Java代码获取此数组,在MainActivity.java中添加代码如下:
Resources res = this.getResources();
String strings[] = res.getStringArray(R.array.test_array); //这里通过ID-test_array来引用字符串数组资源,它也是int型的。引用后自动解析为String类型。
for(String s: strings){
Log.d("example", s);
}
eclipse中运行此工程,LOG_CAT中将收到上述的三个字串。这里字串是数组的元素,故其XML节点为item,在R类中也不生成ID,当然作为resources的子节点string-array,在R类中自动生成静态类,查看R.java文件会发现下面代码段:
public static final class array {
public static final int test_array=0x7f060000;
}
通过上面的学习对字符串资源及字符串数组资源有了深刻的认识,在后面的学习中将会学习到更多的资源。