Android项目目录结构
??? 我们以HelloAndroid项目,来分析其项目目录结构,对Android项目进一步的深入了解。首先启动Eclipse,展开"Package Explorer"导航器中的"HelloAndroid"项目,如图3-1所示。
?manifest
根节点,描述了package中所有的内容
xmlns:android
包含命名空间的声明。
xmlns:android=http://schemas.
android.com/apk/res/android,使得
Android中各种标准属性能在文件中使用,
提供了大部分元素中的数据
Package
声明应用程序包
application
包含package中application级别组件声
明的根节点。此元素也可包含application
的一些全局和默认的属性,如标签、icon、
主题、必要的权限,等等。一个manifest
能包含零个或一个此元素(不能大余一个)
android:icon
应用程序图标
android:label
应用程序名字
Activity
用来与用户交互的主要工具。Activity是用
户打开一个应用程序的初始页面,大部分
被使用到的其他页面也由不同的activity所
实现,并声明在另外的activity标记中。
注意,每一个activity必须有一个<activity>
标记对应,无论它给外部使用或是只用于
自己的package中。如果一个activity没有
对应的标记,你将不能运行它。另外,
为了支持运行时查找Activity,可包含一个
或多个<intent-filter>元素来描述activity所支持的操作
android:name
应用程序默认启动的activity
intent-filter
声明了指定的一组组件支持的Intent值,从
而形成了IntentFilter。除了能在此元素下指
定不同类型的值,属性也能放在这里来描
述一个操作所需的唯一的标签、icon和其他信息
action
组件支持的Intent action
category
组件支持的Intent Category。这里指定
了应用程序默认启动的activity
uses-sdk
该应用程序所使用的sdk版本相关
下面我们看看资源文件中一些常量的定义,如String.xml,如代码清单3-3所示。
代码清单3-3 String.xml
- <?xml?version="1.0"?encoding="utf-8"?>?<resources>?
- ????<string?name="hello">Hello?World,?HelloAndroid!</string>?????<string?name="app_name">HelloAndroid</string>?
- </resources>?
这个文件很简单,就定义了两个字符串资源,与R.java中对应的索引如代码清单3-4所示。
代码清单3-4 R.java中的String类
- public?static?final?class?string?{ ?????public?static?final?int?app_name=0x7f040001; ?
- ????public?static?final?int?hello=0x7f040000; ?}?
在程序中装载并使用这个字符串资源如代码清单3-5。
代码清单3-5 String资源的使用
- Resources?r?=?this.getContext().getResources(); ?String?appname=?((String)?r.getString(R.string.app_name)); ?
- String?hello=?((String)?r.getString(R.string.hello));?
基本上可以定义出项目中所有使用的常量,例如颜色。所以,可根据需对资源常量进行定义。下面是定义了颜色的常量colors.xml,如代码清单3-6所示。
代码清单3-6 colors.xml
- <?xml?version="1.0"?encoding="utf-8"?>?<resources>?
- ????<color?name="status_idle">#cccccc</color>?????<color?name="status_done">#637a47</color>?
- ????<color?name="status_sync">#cc9900</color>?????<color?name="status_error">#ac4444</color>?
- </resources>?
现在我们来分析HelloAndroid项目的布局文件(layout),首先我们打开res->layout->main.xml文件,如代码清单3-7所示。
代码清单3-7 main.xml
- <?xml?version="1.0"?encoding="utf-8"?>?<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"?
- ????android:orientation="vertical"?????android:layout_width="fill_parent"?
- ????android:layout_height="fill_parent"?????>?
- <TextView?? ?????android:layout_width="fill_parent"? ?
- ????android:layout_height="wrap_content"? ?????android:text="@string/hello"?
- ????/>?</LinearLayout>?
代码清单3-7中,有以下几个布局和参数。
< LinearLayout>:线性版面配置,在这个标签中,所有元件都是按由上到下的排队排成的。
android:orientation:表示这个介质的版面配置方式是从上到下垂直地排列其内部的视图。
android:orientation:表示这里是水平排列
android:layout_width:定义当前视图在屏幕上所占的宽度,fill_parent即填充整个屏幕。
android:layout_height:定义当前视图在屏幕上所占的高度,fill_parent即填充整个屏幕。
wrap_content:随着文字栏位的不同而改变这个视图的宽度或高度。
layout_weight 用于给一个线性布局中的多个视图的重要度赋值。所有视图都有layout_weight 值,默认为零,即需要显示多大的视图就占据多大的屏幕空间。如果值大于零,则将父视图中的可用空间分割,分割大小具体取决于每一个视图的layout_weight 值和该值在当前屏幕布局的整体 layout_weight 值,以及在其他视图屏幕布局的layout_weight 值中所占的比例。
在这里,布局中设置了一个TextView,用来配置文本标签Widget,其中设置的属性android:layout_width为整个屏幕的宽度,android:layout_height可以根据文字来改变高度,而android:text则设置了这个TextView要显示的文字内容,这里引用了@string中的hello字符串,即String.xml文件中的hello所代表的字符串资源。hello字符串的内容"Hello World, HelloAndroid!"这就是我们在HelloAndroid项目运行时看到的字符串。
最后,我们来分析HelloAndroid项目的主程序文件HelloAndroid.java,如代码清单3-8所示。
代码清单3-8 HelloAndroid.java
- package?com.yarin.Android.HelloAndroid; ??
- import?android.app.Activity; ?import?android.os.Bundle; ?
- ?public?class?HelloAndroid?extends?Activity ?
- { ??
- ????public?void?onCreate(Bundle?savedInstanceState) ?????{ ?
- ????????super.onCreate(savedInstanceState); ?????????/*?设置Activity要显示的布局为(R.layout.main)?*/?? ?
- ????????setContentView(R.layout.main); ?????} ?
- }?
主程序HelloAndroid类继承自Activity类,重写了void onCreate(Bundle savedInstanceState)方法。在onCreate方法中通过setContentView(R.layout.main)设置了Activity要显示的布局文件(\layout\main.xml)。
到这里,是不是明白了为什么我们在创建项目时没有进行编码就可以直接运行程序呢?当然,这也是Android开发的特点,这样可以很轻松地将代码和UI分开,在国际化和程序维护方面有着巨大的作用。如果你的Android程序需要自适应国际化,比如说多国语言等问题,那么就可以定义不同语言的UI布局,在程序装载时调用不同的布局。而且,如果我们需要修改UI的一些问题,就不必查看代码了,直接更改这些布局文件即可,是不是很方便?当然,这需要开发者在开发时使用这种MVC框架,尽量减少使用"硬编码"。这里,笔者个人建议使用这种框架。