资源是您在代码中使用到的并且在编译时被打包进您的应用程序的附加文件。
Android支持多种不同的文件,包括
XML、
PNG和
JPEG文件。
XML文件的格式决定于其描述的内容。这些文件将描述文件支持的类型、语法或格式。
处于加载效率的考虑,资源被从代码中分离出来,而且
XML文件被编译进二进制代码中。字符串,类似的会被压缩存储为更经济的格式。处于这样或那样的原因,
Android平台中会存在很多不同的资源和资源定义文件。
这些文件包括以下部分:
o
创建资源
o
使用资源
§
在代码中使用资源
§
引用资源
§
引用主体属性
§
使用系统属性
o
更改资源
o
资源引用
o
术语表
- 国际化(
l18N)
配合资源引用文档,
Android提供了一套经济的资源处理技术。他转化了大量的资源信息,使
Android在运行时无需了解文档的内容,仅仅在您需要的时候指导他在哪儿就可以了。
资源
这一节包含了与资源有关联的术语表和一系列使用资源的代码事例。更完整的
Android资源指南请参看“资源”一章。
Android资源系统保存所有与代码无关资源的存根。您可以使用
Resources类访问您应用程序的资源;与应用程序相关联的资源实例可以通过
Context.getResources()得到。
一
个应用程序的资源可以被构建系统在构建时编译进二进制的应用程序里。为了使用资源,您需要正确的初始化您应用程序中的资源树并且构建您的应用程序。在构建
过程的部分,每个资源的标识被产生,您可以在代码中使用他们。这些标识允许编译器校验您应用程序中的代码和资源定义是否匹配。
有关本章的其他细节请参见教程如何使用资源的部分。
创建资源
Android支持字符串,位图和许多其他类型的资源。每一种资源定义文件的语法和格式及保存的位置取决于其依赖的对象。通常,您可以通过三种文件创建资源:
XML文件(除位图和原生文件外),位图文件(作为图片)和原生文件(所有其他的类型,比如声音文件)。事实上,这里有两种不同类型的
XML文件,一种是作为资源被编译近应用程序,另一种怎是资源的描述,被
aapt使用。下面的表格详细说明了这些
XML文件的类型和结构。
您可以在您项目
res/目录下的适当子目录下创建和存储资源文件。
Android使用资源编译器访问资源所在的子目录和格式化的文件。下面的表格列出了每一种资源的文件类型。参见“资源引用”一节可以了解关于对象、语法和格式方面的内容。
目录 |
资源类型 |
res/anim |
XML文件编译为桢序列动画或者自动动画对象。 |
res/drawable |
.png, 使用 |
res/layout |
资源编译为屏幕布局器。参见“ |
res/values |
XML 文件可以被编译为多种资源 注意 这些文件可以自定义名称。这里有一些约定俗成的文件。
|
res/xml |
自定义的 |
res/raw |
自定义的原生资源,将被直接拷贝入设备。这些文件将不被压缩近您的应用程序。使用带有 |
资源被最终编译近
APK文件。
Android创建包装类
R,您可以用他找回资源。
R包含一些与资源所在目录同名的子类。
全局资源
- 很多资源都允许您定义颜色。
Android接受
web风格的颜色定义
-一组十六进制的颜色值,按照以下序列排列:
#RGB,
#ARGB,
#RRGGBB,
#AARRGGBB。
- 所有的颜色都支持
ALPHA通道,头两位十六进制数字指定透明度。
0在
ALPHA通道中表示全透明,默认值是不透明。
使用资源
这一节讲述如何使用您所创建的资源,包括:
·
在代码中使用资源 如何在代码中使用资源。
·
如何引用其他资源中的资源 您可以从其他资源中引用资源。您可以重新使用资源内部的通用资源。
·
支持资源更替 您可以在加载时依据语言、显示配置和主机硬件的不同指定不同的资源。
在编译时,
Android生成名为
R的类。
R包含您应用程序所用到的所有的类。这个类包含一些与
res下子目录同名的子类。这些子类包含每一个您在资源文件中定义的资源的标识。这些资源标识可以在您的代码中引用。这里有一段简单的资源文件,包含一些文字,布局器和图片资源。
注意
:
R类是自动生成的,并且它不能被手动修改。当资源发生变动时,它会自动修改。
package
com
.
android
.
samples
;
public
final
class
R
{
public
static
final
class
string
{
public
static
final
int
greeting
=
0x0204000e
;
public
static
final
int
start_button_text
=
0x02040001
;
public
static
final
int
submit_button_text
=
0x02040008
;
public
static
final
int
main_screen_title
=
0x0204000a
;
};
public
static
final
class
layout
{
public
static
final
int
start_screen
=
0x02070000
;
public
static
final
int
new_user_pane
=
0x02070001
;
public
static
final
int
select_user_list
=
0x02070002
;
};
public
static
final
class
drawable
{
public
static
final
int
company_logo
=
0x02020005
;
public
static
final
int
smiling_cat
=
0x02020006
;
public
static
final
int
yellow_fade_background
=
0x02020007
;
public
static
final
int
stretch_button_1
=
0x02020008
;
};
};
在代码中使用资源
在代码中使用资源需要知道完整的资源
ID
和您的资源对象类型。下面是资源引用语法:
R.resource_type.resource_name
或者
android.R.resource_type.resource_name
resource_type
是
R
类中保存制定类型资源的子类。
resource_name
是定义在
XML
文件中的资源名或者被其他文件类型所定义的资源文件名(无扩展名)
每一类型的资源都依据其类型,被添加入某一指定的
R
子类;学习
R
子类的类型关系请参考资源引用一节。您的应用程序引用已被编译的资源时可以不带包名(比如
R.resource_type.resource_name
)。
Android
包含一个标准资源的序号,比如屏幕的样式和按钮的背景。引用这些资源,您必须使用带
android
的语法,比如
android.R.drawable.button_background
。
下面是一些好的和不好的代码例子:
// Load a background for the current screen from a drawable resource.
this . getWindow (). setBackgroundDrawableResource ( R . drawable . my_background_image );
// WRONG Sending a string resource reference into a
// method that expects a string.
this . getWindow (). setTitle ( R . string . main_title );
// RIGHT Need to get the title from the Resources wrapper.
this . getWindow (). setTitle ( Resources . getText ( R . string . main_title ));
// Load a custom layout for the current screen.
setContentView ( R . layout . main_screen );
// Set a slide in animation for a ViewFlipper object.
mFlipper . setInAnimation ( AnimationUtils . loadAnimation ( this ,
R . anim . hyperspace_in ));
// Set the text on a TextView object.
TextView msgTextView = ( TextView ) findViewByID ( R . id . msg );
msgTextView . setText ( R . string . hello_message );
引用资源
一个属性值(或资源)同样可以引用资源。这种用法常在资源布局器文件中用于文字和图片(定义在其他文件中)。这种方法可以引用任何资源,包括颜色和整数。
比如,如果我们有一个颜色资源,我们可以写一个布局器文件,在其中指定文本颜色和尺寸。
<?xml version="1.0" encoding="utf-8"?>
<EditText id="text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:textColor="@color/opaque_red"
android:text="Hello, World!" />
注意,“
@
”前缀声明这是一个资源引用
—
随后的文本是以
@[package:]type/name
形式提供的资源名。在这个例子中我们不需要指明特定的包,因为我们在我们自己的包中引用。引用一个系统文件时,我们需要这样写:
<?xml version="1.0" encoding="utf-8"?>
<EditText id="text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:textColor="@android:
color/opaque_red"
android:text="Hello, World!" />