2008年4月28日

Android学习系列之三--Hello Android

注:本系列文章原文内容来自http://code.google.com/android的介绍,每章之前会给出原始文章地址,主要为共享资源使用,欢迎教学用转载。用于商业用途请先联系作者。

Hello Android!

原文
程序员对一个新的开发环境的第一映象一般来自于经典的helloworld程序。在Android中,这是非常容易的,让我们看看该怎么做:

程序员对一个新的开发环境的第一映象一般来自于经典的helloworld程序。在Android中,这是非常容易的,让我们看看该怎么做:
 创建工程
 建立UI
 运行代码:Hello,Android
之后的小节详细讲了下面的内容:
 升级UI为XML布局方式
 调试
 在Eclipse之外创建工程
让我们开始吧!

创建工程
创建一个工程是很容易的事情,一个Eclipse插件(APE)提供了所需的功能。你需要安装了Eclipse 3.2或者3.3,同时也要安装APE插件。(下面的内容假设你已经安装了Eclipse和插件,如果没有请查看本系列手册之二,其中详细描述了安装插件的过程)
首先,我们先从全局看看建立“Hello,World!”工程的过程:
1. 通过File>New>Project菜单建立一个Android工程。
2. 在Android工程对话框中填写工程的细节信息。
3. 编译自动生成的源代码模板以便显示一些输出。
上面就是所有要做的工作,让我们进入每一步的细节来看吧。
1. 创建一个新的Android工程
在Eclipse环境中,选择File>New>Project。如果APE插件已经被成功的安装,那么会显示出下面的对话框:
http://static10.photo.sina.com.cn/orignal/53ba798343f55261b1749
在上面的对话框中选择“Android Project”,点击Next。
2. 填写项目详细内容
下面显示的对话框允许你输入工程的详细内容,这是一个例子:
http://static16.photo.sina.com.cn/orignal/53ba798306cbbb85f24ff
每个文本框的内容含义如下:
Project Name:
包含你所创建的工程的目录的名字。
Package Name:
包的名字空间――类似于Java语言――你所有的源代码都位于其下。This also sets the package name under which the stub Activity will be generated.
你的代码使用的包名必须在系统中所有包中是唯一的,不能重复。出于这个原因,为你的程序使用标准的域命名格式是非常重要的。在上面的例子中,我们使用域“com.google.android”,你可以根据你组织的情况选择一个不同的名字。
Activity Name:
这是APE插件要自动生成的stub类的名字,将会是Android的Activity类的一个子类。一个Activity就是一个可以执行并做一些事情的类,如果愿意它可以创建UI,不过并非必须。
Application Name:
这是你的程序的可读的title名字。

选择框“Use default location”允许你改变目录路径,指向你想要存储工程文件的地方。
3. 编辑自动生成的源代码
在插件运行之后,你会有一个名字叫HelloAndroid的类,其内容类似下面所示:
public class HelloAndroid extends Activity
{

@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
}
}
下一步将会开始修改这个文件!

建立UI
一旦你建立了工程,很明显下一步就是编写代码(the obvious next step is to get some text up there on the screen)。这里有一段完成的代码――后面我们将仔细解释每一行。
public class HelloAndroid extends Activity {

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
TextView tv = new TextView(this);
tv.setText("Hello, Android");
setContentView(tv);
}
}
注意你需要添加下面的内容到代码之前,才能编译这个例子:
import android.widget.TextView;
在Android中,用户接口由等级继承的类View组成。一个View是一个可在屏幕上画出来的对象,比如比例调节按钮、动画,或者(在这个例子中)一个文本条。The specific name for the View subclass that handles text is simply TextView.
下面是一个创建TextView的例子:
TextView tv = new TextView(this);
传递给TextView的创建函数的参数是一个Android上下文实例,是一个系统句柄,提供了资源解析、数据库访问等服务。Activity类继承于上下文。因为我们的HelloAndroid类是Activiry的一个子类,它也是一个上下文,所以我们能把“this”引用传递给TextView。
建立了TextView之后,我们需要告诉它显示什么内容:
tv.setText("Hello, Android");
Nothing too surprising there。
到现在为止,我们建立了一个TextView,并且告诉它该显示什么内容。最后一步是将这个TextView与屏幕显示连接起来,就像下面:
setContentView(tv);
Activity类中的setContentView方法告诉系统将哪个View与Activity的UI联系到一起。如果Activity没有调用这个方法,就不会有UI显示出来,系统将显示一个空白屏幕。对我们来说,想显示一些文本,所以吧我们刚建立的TextView传给该函数。
好了,这就是我们的“hello,world!”!下一步当然就是,看看运行结果了,:)

运行代码:Hello,Android
Eclipse插件使得运行应用程序非常容易。通过选择Run>Open Run Dialog菜单选项,你可以看到类似下面的对话框:
http://static4.photo.sina.com.cn/orignal/53ba798306cbbb860a843
(下面是创建配置的内容,上面一节已经讲到了,有点基础的朋友应该都能轻松搞定,这里就省略了)
http://static4.photo.sina.com.cn/orignal/53ba798343f5533c824b3
这个图跟上一篇最后得到的差不多,不过上篇我没修改代码,所以是空白的,:)
注意:在运行或者调试Android程序,关闭仿真器之后,记得在任务管理器中关闭adb.exe,否则你下次运行的结果可能不正确,我就在这上面浪费了半个多小时,还纳闷呢。
升级UI为XML布局方式
上外面完成的“hello world”例子程序使用的是我们称之为“程序化”的UI布局方式,这种方式下你直接在源代码中建立UI布局。如果你有过很多UI编程经验的话,你可能会知道这种方式在某些时候可能是多么的脆弱:不居上很小的改动都可能导致很大的源代码修改,让人头痛。同时,也可能很容易搞忘记正确的将View连接在一起,而这会导致布局上的错误,浪费你调试代码的时间。
这就是为什么Android提供另外的UI布局方式的原因:基于XML文件的布局方式。最简单的解释可以通过一个例子进行,这里有一个XML布局文件,跟你刚刚完成的程序布局方式例子具有相同的效果:

android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Hello, Android"/>

Android中通常的XML布局文件的结构比较简单。这是一个标签组成的树,每个标签是一个View类的名字。在这个例子中,是一个仅有一个 TextView元素的非常简单的树。你可以使用任何View类的扩展类作为标签名,包括在你自己的代码中定制的View类。这种结构使快速建立UI变得简单,使用比你源代码中简单的多的结构和符号完成。这种模式的创意来自于WEB开发模式,将应用程序的表现(UI)和逻辑分离开。
在本例中,有四个XML属性。下面是各个属性的简介:
xmlns:android
这是一个XML名字空间宣告,告诉Android工具你将会引用Android名字空间中定义的普通属性。每个Android布局文件的最外层标签都必须包含这个属性。
android:layout_width
该属性定义了View要占用的屏幕有效宽度。在本例中,这是我们唯一的View,所以我们让他占用整个屏幕,“fill_parent”表示这个意思。
android:layout_height
跟android:layout_width相同,只是它表示高度。
android:text
该属性设置TextView包含的文字信息。本例中,是我们的字符串“Hello,Android”。

这就是XML布局文件,但是它应该放在哪里呢?就在你的工程的res目录下。“res”是“resource”的所写,该目录包含了工程所有的非代码的资源,包括图象、本地化字符串,以及XML布局文件。
Eclipse插件会创建一个XML布局文件。在我们上面的例子中,我们根本没有使用它。在包浏览器中,展开目录res/layout,编辑文件main.xml,用上面的文本替换其中的内容,然后保存更改。
现在,通过包管理器打开源代码目录中的文件R.java,你将会看到类似下面的内容:
public final class R {
public static final class attr {
};
public static final class drawable {
public static final int icon=0x7f020000;
};
public static final class layout {
public static final int main=0x7f030000;
};
public static final class string {
public static final int app_name=0x7f040000;
};
};
一个工程的R.java文件是对其中所有资源的索引,你可以在该类中方便的找到你工程中包含的资源。This is particularly powerful with the code-completion features of IDEs like Eclipse because it lets you quickly and interactively locate the specific reference you're looking for.
下载要注意的重要的事情是内层的名为“layout”的类,以及他的成员“main”。Eclipse插件会注意到你添加了一个新的XML布局文件,然后重新生成R.java文件。当你添加了其它资源时,也会看到R.java发生改变,与新内容保持一致。
最后需要做的是修改你的HelloAndroid源代码以便使用新的XML版本UI,替换刚才的硬编码的版本,下面是你的新类。正如你所看到的,源代码变得简单多了。
public class HelloAndroid extends Activity {

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
}
当你做这个改变时,不要仅仅做拷贝粘贴,试试R类中的代码自动完成功能。你会发现这很有用。
现在你修改了代码,可以重新运行你的应用程序了――所有你需要做的仅仅是点击绿色的运行箭头,或者选择Run>Run Last Launched(没找到Run Last Launched,只有Run History??)。你将会看到跟之前同样的结果!毕竟,我们是要告诉你两种不同的布局方式实现同样的效果。
关于创建XML布局文件有非常多内容,不过那不是本小节要介绍的内容了。请看文档Implementing a User Interface(http://code.google.com/android/devel/implementing-ui.html)。

调试工程
APE插件同样也有优秀的与Eclipse继承的调试工具。为了展示这一点,让我们先在代码里加点错误进去。像下面这样,修改你的HelloAndroid源代码:
public class HelloAndroid extends Activity {

@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Object o = null;
o.toString();
setContentView(R.layout.main);
}
}
上面的改动简单的添加了一个空指针错误。如果你再次运行你的程序,会得到下面的结果:
http://static4.photo.sina.com.cn/orignal/53ba798343f5533f4fb13
为了找出哪里出了错,可以在你的代码中“Object o=null;”这行加入一个断点(可以双击Eclipse中该行代码左边的位置添加),然后选择Run>Debug Last Launched(还是没有找到Debug Last Launched,不过不影响我们调试,用Debug History选或者Open Debug Dialog选择均可)进入调试模式。你的程序将重新启动仿真器,不过这次他会在断点处挂起。然后,你可以在调试视图下单步执行你的代码,就像你调试其它任何程序一样。
http://static12.photo.sina.com.cn/orignal/53ba798343f5533f379fb

在Eclipse之外创建工程
如果你不使用Eclipse(譬如你更喜欢使用其它IDE,或者只喜欢使用文本编辑器和命令行工具),Eclipse插件就帮不了你的忙了。不过无需担心――你不会因为你不使用Eclipse而损失任何功能。
APE插件实际上只是一个Wrapper,包含了对Android SDK中一系列工具的使用(比如仿真器,aapt,adb,ddms等等,详情参见http://code.google.com/android/intro/tools.html)。因此,你完全可以用其它的工具包装这些必要的编译调试工具,比如一个ant build file。
Android SDK包含一个名为“activityCreator.py”的Python脚本,用来创建工程的所有的源代码和目录,以及一个ant兼容的build.xml文件。这允许你通过命令行建立你自己的工程,或者集成到你喜欢的IDE中去。
比如,要建立通过命令行一个跟上面的例子相同的Android工程,可以用下面的命令:
activityCreator.py --out HelloAndroid com.google.android.hello.HelloAndroid
要建立实际的工程,然后你需要运行命令“ant”。当成功运行之后,你会在bin目录下得到一个名为HelloAndroid.apk的文件。这个apk文件是一个Android包,可以使用adb工具在你的仿真器上安装和运行。
如果想了解关于这些工具的详细情况,请参见前面提到的文档,这是它的地址:http://code.google.com/android/intro/tools.html。




没有评论: