使用字符串、颜色、尺寸资源
使用字符串资源、颜色资源、尺寸资源,它们对应的XML文件都将位于/res/values目录下,它们默认的文件名,以及在R类中对应的内部类如表6.2所示。
资源类型 | 资源文件的默认名 | 对于R类中的内部类的名称 |
---|---|---|
字符串资源 | /res/values/strings.xml | R.strings |
颜色资源 | /res/values/colors.xml | R.color |
尺寸资源 | /res/values/dimens.xml | R.dimen |
1、颜色值的定义
Android中的颜色值是通过红(Red)、绿(Creen)、蓝(Blue)三原色,以及一个透明度(Alpha)值来表示的,颜色值总是以(#)开头,接下来就是Alpha-Red-Green-Blue的形式。其中Alpha值可以省略,如果省略了Alpha值,那么该颜色默认是完全不透明的。
Android颜色值支持常见的4种形式。
- #RGB:分别指定红、绿、蓝三原色的值(只支持0-f这16级颜色)来代表颜色。
- #ARGB:分别指定红、绿、蓝三原色的值(只支持0-f这16级颜色)及透明度(只支持0-f这16级透明度)来代表颜色。
- #RRGGBB:分别指定红、绿‘蓝三原色的值(支持00-ff这156级颜色)来代表颜色。
- #AARRGGBB:分别指定红、绿、蓝三原色的值(支持00-ff这256级颜色)以及透明度(支持00-ff这256级透明度)来代表颜色。
上面4种形式中,A、R、G、B都代表一个十六进制的数,其中A代表透明度,R代表红色的数值、G代表绿色数值、B代表蓝色数值。
2、定义字符串、颜色、尺寸资源文件
字符串资源文件位于/res/values 目录下,字符串资源文件的根元素是<resources...>,该元素里每个<strin.../>子元素定义一个字符串常量,其中<string.../>元素的name属性指定该常量的名称,<string.../>元素开始标签和结束标签之间的内容代表字符串值.
如下文件是该示例的字符串资源文件。
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">字符串、数字、尺寸资源</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="hello">Hello world,ValuesResTest!</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>
上面的程序代码中每个<string.../>元素定义一个字符串,其中<string.../>元素的name属性定义字符串的名称,<string>与</string>中间的内容就是该字符串的值。
颜色资源文件位于/res/values目录下,颜色资源文件的根元素是<resources.../>,该元素里每个<color.../>子元素定义一个字符串常量,其中<color.../>元素里的name属性指定该颜色的名称,<color.../>元素开始标签和结束标签之间的内容代表颜色值,如以下文件是该示例的颜色资源文件。
<?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.../>元素定义一个字符串,其中<color.../>元素的name属性定义颜色的名称,<color>与</color>中间的内容就是该颜色的值。
尺寸资源文件位于/res/values目录下,尺寸资源文件的根元素是<resources...>,该元素里每个<dimen.../>子元素定义一个尺寸常量,其中<dimen.../>元素的name属性指定该尺寸的名称,<dimen.../>元素开始标签和结束标签之间的内容代表尺寸,如以下代码所示。
<resources> <dimen name="spacing">8dp</dimen> <!-- 定义GridView组件中每个单元格的宽度、高度 --> <dimen name="cell_width">60dp</dimen> <dimen name="cell_height">66dp</dimen> <!-- 定义主程序标题的字体大小 --> <dimen name="title_font_size">18sp</dimen> </resources>
上面三份资源文件分别定义了字符串、颜色、尺寸资源,应用程序接下来既可在XML文件中使用这些资源,也可在Java代码中使用这些资源。
3、使用字符串、颜色、尺寸资源
正如前面介绍的,在XML文件中使用资源按如下语法格式:
@[<package_name>:]<resource_type>/<reource_name>
下面程序的界面布局中大量使用了前面定义的资源。
界面布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="center_horizontal" > <!-- 使用字符串资源,尺寸资源 --> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/app_name" android:gravity="center" android:textSize="@dimen/title_font_size" /> <!-- 定义一个GridView组件,使用尺寸资源中定义的长度来指定水平间距、垂直间距 --> <GridView android:id="@+id/grid01" android:layout_width="wrap_content" android:layout_height="wrap_content" android:horizontalSpacing="@dimen/spacing" android:verticalSpacing="@dimen/spacing" android:numColumns="3" android:gravity="center"></GridView> </LinearLayout>
上面的程序中粗体字代码就是使用字符串资源、尺寸资源的代码。
在Java代码中使用资源按如下语法格式:
[<package_name>.]R.<resource_type>.<resource_name>
下面的Java程序中使用了上面定义的三种资源。
package com.example.studyresources; import android.os.Bundle; import android.app.Activity; import android.content.res.Resources; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.TextView; public class ValuesResTest extends Activity { //使用字符串资源 int[] textIds=new int[]{ R.string.c1,R.string.c2,R.string.c3, R.string.c4,R.string.c5,R.string.c6, R.string.c7,R.string.c8,R.string.c9}; //使用颜色资源 int[] colorIds=new int[]{ R.color.c1,R.color.c2,R.color.c3, R.color.c4,R.color.c5,R.color.c6, R.color.c7,R.color.c8,R.color.c9 }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_values_res_test); //创建一个BaseAdapter对象 BaseAdapter ba=new BaseAdapter() { @Override public int getCount() { // TODO Auto-generated method stub //指定一共包含9个选项 return textIds.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub // return getResources().getText(textIds[position]); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub TextView text=new TextView(ValuesResTest.this); Resources res=ValuesResTest.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; }}; GridView grid=(GridView)findViewById(R.id.grid01); //为GridView设置Adapter grid.setAdapter(ba); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.values_res_test, menu); return true; } }
上面的程序中粗体字代码分别使用了前面定义的字符串资源、数组资源和颜色资源,运行上面的程序,将可以看到如图6.1所示的界面。
与定义字符串资源类似的是,Android也允许使用资源文件来定义boolean常量,例如在/res/values目录下增加一个bools.xml文件,该文件的根元素也是<resources.../>,根元素内通过<bool.../>子元素来定义boolean常量,示例如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <bool name="is_male">true</bool > <bool name="is_big">false</bool> </resources>
一旦在资源文件中定义了如上所示的资源文件之后,接下来在Java代码中按如下语法格式访问即可:
[<package_name>.]R.bool.bool_name
在XML文件中按如下格式即可访问资源:
@[<package_name>:]bool/bool_name
例如为了在Java代码中获取指定boolean变量的值,可通过如下代码来实现:
Resources res=getResources();
boolean is_male=res.getBoolean(R.bool.is_male);
与定义字符串资源类似的是,Android也允许使用资源文件来定义整型常量,例如在/res/values目录下增加一个integers.xml文件(文件名可以自由选择),该文件的根元素也是<resources.../>,根元素内通过<integer.../>子元素来定义整刑常量,示例如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <integer name="my_size">32</integer> </resources>
一旦在资源文件中定义了如上所示的资源文件之后,接下来在Java代码中按如下语法格式访问即可。
[<package_name>.]R.integer.integer_name
在XML文件中按如下格式即可访问资源:
@[<package_name>:]integer/integer_name
例如为了在Java代码中获取指定整形变量的值,可通过如下代码来实现:
Resources res=getResources();
int my_size=res.getInteger(R.bool.my_size);