资源的类型及存储方式——使用资源
在Android应用中使用资源可分为在Java代码和XML文件中使用资源,其中Java代码用于为Android应用定义四大组件,而XML文件中则用于为Android应用定义各种资源。
1、在Java代码中使用资源清单项
由于Android SDK会在编译应用时在R类中为/res目录下的所有资源创建索引项,因此在Java代码中访问资源主要通过R类来完成,其完整的语法格式为:
[<package_name>.]R.<resource_type>.<resource_name>
上面语法格式中各成分的说明如下。
- <package_name>:指定R类所在包,实际上就是使用全限定类名。当然,如果在Java程序中导入R类所在包,就可以省略包名。
- <resources_type>:R类中代表不同资源类型的子类,例如string代表字符串资源。
- <resources_name>:指定资源的名称。该资源名称可能是无后缀的文件名(如图片资源),也可能是XML资源元素中由android:name属性所指定的名称。
例如如下代码片段:
//从drawable资源中加载图片,并设为该窗口的背景 getWindow().setBackgroundDrawableResource(R.drawable.back); //从string资源中获取指定字符串资源,并设置该窗口的标题 getWindow().setTitle(getResources().getText(R.string.main_title)) //获取指定的TextView组件,并设置该组件显示string资源中的指定字符串资源 TextView msg=(TextView)findViewById(R.id.msg); msg.setText(R.string.hello_message);
2、在Java代码中访问实际资源
R 资源清单类为所有的资源都定义了一个资源清单项,但这个清单项只是一个int类型的值,并不是实际的资源对象。大部分情况下,Android应用的API允许直接使用int类型的资源清单项代替应用资源。
但有些时候,程序也需要使用实际的Android资源,为了通过资源清单项目来获取实际资源,可以借助于Android提供的Resources类。
Reources主要通过了如下两类方法。
- getXxx(int id):根据资源清单ID来获取实际资源。
- getAssets():获取访问/assets/目录下资源的AssetManager对象。
Resources由Context调用getResources()方法来获取。
下面的代码片段示范了如何通过Resources获取实际字符串资源。
//直接调用Activity的getResources()方法来获取Resources对象 Resources res=getResources(); //获取字符串资源 String mainTitle res.getText(R.string.main_title); //获取Drawable资源 Drawable logo=res.getDrawable(R.drawable.logo); //获取数组资源 int[] arr=res.getIntArray(R.array.books);
3、在XML代码中使用资源
当定义XML资源文件时,其中的XML元素可能需要指定不同的值,这些值可设置为已定义的资源项。在XML代码中使用资源的完整语法格式为:
@[<package_name>:]<resource_type>/<resource_name>
上面语法格式中各成分的说明如下。
- <package_name>:指定资源类所在应用的包。如果所引用的资源和当前资源位于同一个包下,则<package_name>可以省略。
- <resource_type>:R类中代表不同资源类型的子类。
- <resource_name>:指定资源的名称。该资源名称可能是无后缀的文件名(如图片资源),也可能是XML资源元素中由android:name属性所指定的名称。
例如如下代码片段在一份文件中定义了两种资源:
<? version="1.0" encodig="utf-8"> <resources> <color name="red">#ff00</color> <string name="hello">Hello!</string> </resources>
接下来与它位于同一包中的XML资源文件就可通过如下方式来使用资源:
<EditText xmlns:android="http://schemas.android.com/apk/res/android" android:textColor="@color/red" android:text="@string/hello" android:layout_width="fill_parent" android:layout_height="fill_parent" />