android项目目录结构系列二

3、res/layout/目录下的布局文件简介

本例中的布局文件是 ADT 默认自动创建的“activity_main.xml”文件。在 Eclipse 中,双击 “activity_main.xml”文件打开。.

与在网页中布局中使用 HTML 文件一样,Android 在 XML 文件中使用 XML 元素来设定屏幕布局。每个文件包含整个屏幕或部分屏幕,被编译进一个视图资源,可以被传递 给 Activity.setContentView 或被其他布局文件引用。文件保存在工程的 res/layout/ 目录 下,它被 Android 资源编辑器编译。

三、gen目录介绍

3.1.1 R.java文件基本介绍

    R.java 文件中默认有 attr、drawable、layout、string 等静态内部类,每个静态内部类分别对应一种资源,如 layout 静态内部类对应 layout 中的界面文件,其中每个静态内 部 类 中 的 静 态 常 量 分 别 定 义 一 条 资 源 标 识 符 ,如 “ public static final int main=0x7f030000;”对应的是 layout 目录下的 main.xml 文件。具体的对应关系,如下图。

    展开后看到,所有的资源文件ADT 会在 R.java 文件中相应的匿名内部类当中自动生成一条静态 int 类型的常量,对添加的文件进行索引。

R.java 文件会给我们开发程序带来很大的方便,比如在程序中我们使用“public static final int icon=0x7f020000;”就可以找到其对应的 icon.png 这幅图片。

R.java 文件除了有自动标识资源的“索引”功能之外,还有另一个主要的功能,当 res 目录中的某个资源在应用中没有被使用到,在该应用被编译的时候系统就不会把对应的资源 编译到该应用的 APK 包中,这样可以节省 Android 手机的资源

 3.1.2 组件标识符

    通过对 R.java 文件的介绍,我们已经了解了 R 文件的索引作用,它可以检索到我们应用中需要使用的资源。下面介绍如何通过 R.java 文件来引用到所需要的资源。

1. 在 Java 程序当中,我们可以按照 Java 的语法来引用。

1) R.resource_type.resource_name

需要注意的是,resource_name 不需要文件的后缀名。比如说上面的 icon.png 文件的资源标识符可以通过如下方式获取。R.drawable.icon

2) android.R.resource_type.resource_name

Android 系统本身自带了很多的资源,我们也可以进行引用,只是需要在前面加上 “android.”以声明该资源来自 Android 系统。

2. 在 XML 文件中引用资源的语法如下:

1) @[package:]type/name

使用我们自己包下的资源可以省略 package。

在 xml 文 件 中 , 如 main.xml 以 及 AndroidMainfest.xml 文 件 中 通 过 “@drawable/icon”的方式获取。其中“@”代表的是 R.java 类,“drawable”代表 R.java中的静态内部类“drawable”,“/icon”代表静态内部类“drawable”中的静态属性“icon”。而该属性可以指向 res 目录下的“drawable-*dpi”中的 icon.png 图标。其他类型的文件也比较类似。凡是在 R 文件中定义的资源都可以通过

“@ Static_inner_classes_name/resourse_name”的方式获取。如“@id/button”,“@string/app_name”。

2) 如果访问的是 Android 系统中带的文件,则要添上包名“android:”。如 android:textColor="@android:color/red" 。

3. “@+id/string_name”表达式

顺便说一下,在布局文件当中我们需要为一些组件添加 Id 属性作为标示,可以使用如 下的表达式“@+id/string_name”其中“+”表示在 R.java 的名为 id 的内部类中添加一条 记录。如 "@+id/button"的含义是在 R.java 文件中的 id 这个静态内部类添加一条常量名为button,该常量就是该资源的标识符。如果 id 这个静态内部类不存在,则会先生成它。通 过该方式生成的资源标识符,仍然可以以“@id/string_name”的方式引用。示例代码片段如下。

1. <RelativeLayout android:layout_width="fill_parent"

2. android:layout_height="wrap_content">

3. <Button android:layout_width="wrap_content"

4. android:layout_height="wrap_content"

5. android:text="@string/cancle_button"

6. android:layout_alignParentRight="true" android:id="@+id/cancle" />

7. <Button android:layout_width="wrap_content"

8. android:layout_height="wrap_content"

9. android:layout_toLeftOf="@id/cancle"

10. android:layout_alignTop="@id/cancle" android:text="@string/ok_button" />

11. </RelativeLayout>

复制代码

其中,android:id="@+id/cancle"将其所在的 Button 标识为 cancle,在第二个 Butto中通过"@id/cancle"对第一个 Button 进行引用。

四、AndroidManifest.xml 介绍

    每个应用程序都有一个功能清单文件 AndroidManifest.xml(一定是这个名字)在它的 根目录里。这个清单文件给 Android 系统提供了关于这个应用程序的基本信息,系统在运行任何程序代码之前必须知道这些信息。今后我们开发 Activity、Broadcast、Service 之后都要在 AndroidManifest.xml 中进行定义。另外如果我们使用到系统自带的服务如拨号服 务、应用安装服务、GPRS 服务等都必须在 AndroidManifest.xml 中声明权限。 AndroidManifest.xml 主要包含以下功能:

. 命名应用程序的 Java 应用包,这个包名用来唯一标识应用程序;

. 描述应用程序的组件——活动、服务、广播接收者、内容提供者;对实现每个组件和公布其功能(比如,能处理哪些意图消息)的类进行命名。这些声明使得 Android 系统了解这些组件以及它们在什么条件下可以被启动;

. 决定应用程序组件运行在哪个进程里面;

. 声明应用程序所必须具备的权限,用以访问受保护的部分 API,以及和其它应用程序交互;

. 声明应用程序其他的必备权限,用以组件之间的交互;

. 列举测试设备 Instrumentation 类,用来提供应用程序运行时所需的环境配置及其他信息,这些声明只在程序开发和测试阶段存在,发布前将被删除;

. 声明应用程序所要求的 Android API 的最低版本级别;

. 列举 application 所需要链接的库;

程序中使用的所有组件都会在功能清单文件中列出来,所以我们先分析功能清单文件。只有下列元素才是功能清单文件中的合法元素,应用开发者不能添加自己的元素或属性。

 

下面详细介绍各个标签:

4.1 manifest元素

    该元素是 AndroidManifest.xml 文件的根元素,该元素为必选。其中根据 xml 文件的语法 ,“ xmlns:android ” 指 定 该 文 件 的 命 名 空 间 。 功 能 清 单 文 件 会 使 用 “http://schemas.android.com/apk/res/android”所指向的一个文件。“package”属性是指定 Android 应用所在的包,以后会经常说到“应用的包”,“应用的包”就是指该属性的内容。“android:versionCode”指定应用的版本号。如果应用需要不断升级,在升级的时候应该修改该值。“android:versionName”是版本名称,名称的取定可根据爱好而定。

4.2  <application>元素

<application>是非常重要的一个元素,今后我们开发的许多组件都会在该元素下定义 的。 该元素为必选元素。

<application>的“icon”属性是用来设定应用的图标。icon="@drawable/icon" 该表达式指向的是 icon.png 图片。与R.java中元素的对应关系,如下图。

<application>的“label”属性用来设定应用的名称。指定其属性值所用的表达式 “@string/app_name”含义与上面的表达式“@drawable/icon”一样,同样是指向 R.java 文 件中 的 string 静 态内 部 类中 的 app_name 属 性所 指 向的 资 源。 在 这里 它 指向 的 是“strings.xml”文件中的一条记录“app_name”,其值为“testApp”,因此,这种表达方式等价于 android:label= " testApp "。

 

4.3. <activity>元素

<activity>元素的作用是注册一个 Activity 信息,当我们在创建“testApp”这个项目时,指定了【Create Activity】属性为“HelloWorld”,之后 ADT 在生成项目时帮我们自动创建了一个 Activity 名称就是“HelloWorld.java”,Activity 在 Android 中属于组件,它需要在功能清单文件中进行配置。

<activity>元素的“name”属性指定的是该 Activity 的类名。我们可以看到这个属性值“.HelloWorld”中的“.”,“.”代表的是在上面<manifest>元素的“package”属性中指定的当前包。因而“.HelloWorld”的含义等价于“com.test. HelloWorld.java”。

<activity>元素的“label”属性表示 Activity 所代表的屏幕的标题,其属性值的表达式在上面已经介绍过了,不再赘述。该Activity运行后的效果如下

 

4.4 <intent-filter>元素

    Intent的中文可以理解为“意图,目的”之类的意思。首先简单介绍什么是Intent。应用程序的核心组 件(活动、服务和广播接收器)通过Intent被激活,Intent代表的是你要做的一件事情,代表你的目的,Android 寻找一个合适的组件来响应这个Intent,如果需要会启动这个组件一个新的 实例,并传递给这个Intent对象。后面会有详细的介绍,在此只需有大致印象即可。组件通过intent 过滤器通告它们所具备的功能——能响应的Intent类型。

   是最常见的。它表明这个 activity 将在应用程序加载器中显示,就是用户在设备上看到的可供加载的应用程序列表。换句话说,这个 activity 是应用程序的入口,是用户选择运行这个应用程序后所见到的第一个 activity。


五、android程序的执行流程分析

发布程序到手机上之后,当双击“抽屉”里该应用的图标时,系统会将这个点击事件包装成一个Intent,该Intent包含两个参数

{action :"android.intent.action.MAIN",

category :"android.intent.category.LAUNCHER" },

这个Intent被传递给HelloWorld这个应用之后在应用的功能清单文件中寻找与该Intent匹配的Intent过滤器,如果匹配成功,找到相匹配的Intent过滤器所在的Activity元素,再根据 <activity>元素的“name”属性来寻找其对应的Activity类。接着Android操作系统创建该Activity类的实例对象,对象创建完成之后,会执行到该类的onCreate方法,此OnCreate方法是重写其父类Activity的OnCreate方法而实现。onCreate方法用来初始化Activity实例对象。如下是HelloWorld.java 类中onCreate方法的代码。

其中super.onCreate(savedInstanceState)的作用是调用其父类Activity的OnCreate方法来实现对界面的画图绘制工作。在实现自己定义的Activity子类的OnCreate方法时一定要记得调用该方法,以确保能够绘制界面。

setContentView(R.layout. main)的作用是加载一个界面。该方法中传入的参数是 “R.layout. main”,其含义为R.java类中静态内部类layout的静态常量main的值,而该值是 一个指向res目录下的layout子目录下main.xml文件的标识符。因此代表着显示main.xml所定义的画面。


修改界面显示图标测试:

(1)添加资源文件

(2)修改AndroidManifest.xml文件

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。