[译文]Hello World - Android SDK Tutorials系列

这是Android SDK Tutorials的第一个教程Hello World。介绍了Android开发大概是个什么样子,让读者有个初步的了解。

在使用本教程之前,请确保你的电脑已安装基于Eclipse的Android开发环境。

创建一个新Eclipse工程

  1. 在Eclipse界面, 选择 File > New > Project....
  2. 选中"Android Project",然后点击Next.
    hello_world_0
  3. 填写工程详情:
    • Project name: HelloAndroid
    • Build Target: 选中一个Android版本,版本跟你创建的AVD版本相同,
    • Application name: Hello, Android
    • Package name: com.example.helloandroid (或者你自己的名字空间)
    • Create Activity: HelloAndroid

    点击Finish.

    hello_world_1
    Project Name下面是各个部分的描述:

    这是Eclipse工程名称,也是这个工程所在的目录名,这个目录下包含了这个工程的所有文件。
    Build Target
    这个是用来编译你的应用的Android SDK的版本。例如,你选择Android2.1,Eclipse将基于Android2.1的库来编译你的应用。选择的版本必须低于或者等于你创建的AVD版本。Android应用是前向兼容的,也就是说,基于Android2.1编译的应用,可以在Android2.3.3平台运行,反之则不行。
    Application Name
    应用的名字,会出现在Android设备的应用列表里面。
    Package Name
    这个是包名(命名规则跟Java编程语言一样),里面存放你所有的源代码。这里也同时是根Activity创建的地方。

    你的包在整个Android系统安装的包里名字必须是唯一的;所以使用一个标准域名风格的包名是很有必要的。你可以使用一个和你的公司或组织相关的名字。

    Create Activity
    这个是根Activity的名字。它是Android Activity类的子类。一个Activity就是一个类,能运行,能做一些工作。这个选项是可选的,但是绝大部分情况下,Activity都是一个应用的基础。
    Min SDK Version
    应用程序运行的最低API级别,必须和你选择的Android SDK的版本保持一致。例如,你选择的SDK是2.1版本,那么最低API级别必须是7或者更低。

    其他部分:"Use default location"选项允许你改变你的工程文件的存放位置。

你的Android工程已经创建完毕。它应该显示在Eclipse左边的Package Explorer里面。打开HelloAndroid > src > com.example.helloandroid > HelloAdnroid.java,代码应该是这样的:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

注意这个类继承了Activity类。一个Activity是一个应用的实体,用来执行一些操作。一个应用可以有多个独立的Activity,但是用户同时只能跟其中一个进行交互。当Activity启动的时候,它的onCreate()方法会被Android系统调用,你可以在这个方法里面执行所有的初始化工作。Activity通常会有一个用户交互界面,但也不尽然。

现在让我们修改一些代码!


构造UI

看看下面修改过的代码,把你的HelloAndroid类也做同样的修改。

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       TextView tv = new TextView(this);
       tv.setText("Hello, Android");
       setContentView(tv);
   }
}

小贴士: 自动添加需要的包:Ctrl+Shift+O (Mac平台:Cmd+Shift+O),这是个Eclipse快捷键,根据你的代码自动添加所需要的包。

Android用户界面由一个或多个View按层次的组成。View (视图)是UI层的组成元素,例如按钮、图片,或者文本标签,所有的这些对象的类都派生自类View,处理文本的类是TextView。

添加的内容创建了一个TextView,接受一个AndroidContext实例作为构造参数。Context是Android系统的一个句柄;它提供的功能包括处理各种资源、访问数据以及系统配置等等。类Activity派生自Context,而这里的HelloAndroid类又是Acivity的子类,所以HelloAndroid也是一个Context。因此你可以把this作为一个Context传给TextView。

下一步,使用setText()来设置要显示的文本。

最后,调用setContentView()来把TextView显示在Activity的用户界面上。如果不调用setContentView(),屏幕上将是一片空白,什么也不显示。

这就是Android上"Hello World"应用的全部内容了,下一步,看它怎么运行。


运行应用

Eclipse插件ADT让运行应用很方便:

  1. 选择Run > Run.
  2. 选择"Android Application".

Eclipse插件ADT会自动为你的工程创建一个新的运行配置项目,然后启动Android模拟器。由于开发环境的不同,模拟器可能要过好几分钟才能完全启动,请耐心一点。一旦模拟器启动完毕,ADT会安装应用到模拟器里面,然后启动主界面。你应该能看到下面的画面:

hello_world_5

你看到的灰色条上的“Hello, Android"实际上是应用的标题。

这就是初级教程"Hello World"所有内容了,但你还得继续学习一些更有价值的东西。


升级UI到XML布局

你刚完成的"Hello World"示例使用一种叫做”编程式“ UI布局,这意味着你在源代码里面构建应用的UI。如果你曾经做过很多UI的编程,应该会知道这种方法有时是多么累人:UI一个小的改动,需要修改代码里很多地方。这种方式也容易忘记各个View是怎么排列的,导致布局错误,需要大量时间调试代码。

这就是为什么Android会提供一个替代方案:基于XML文件的布局方式。下面我们看具体的例子:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/textview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:text="@string/hello"/>

这是Android XML布局文件的一般结构:XML元素树,里面每个节点都是一个类View的名字(这个例子只有一个View)。你可以使用任何派生自类View的类的名字作为XML布局的元素,包括你自己定义的派生自类View的类。这种结构很容易快速搭建用户界面,相比界面编程更简单。这个模型来源于Web开发模型:将业务逻辑和表现形式分离。

在上面的XML例子里面只有一个View元素:TextView,它有5个XML属性:

属性

含义

xmlns:android
命名空间声明:通知Android工具,你将引用Android名字空间的通用属性。在Android布局文件的最外面的标签都必须包含这个属性。

android:id
为TextView分配一个唯一的标识符,可以通过这个标识符在代码或者其他XML资源里面引用这个View。

android:layout_width
设置这个View应该占据屏幕多宽的地方。这个例子里面,这是唯一的一个View,所以你希望它占据真个屏幕,这就是”fill_parent“的含义。

android:layout_height
和layout_width一样,只不过是针对屏幕的高度。

android:text
设置TextView要显示的内容。这个例子里,使用一个字符串资源代替代码里硬编码的字符串。

这个XML布局文件保存在res/layout目录下。"res" 是"resources" 的简写,res目录下包含应用需要的所有非编码的资源。除了XML布局文件,资源还包括图片、音频,还有国际化相关的字符串。

ADT会自动创建一个布局文件:main.xml。在刚完成的"Hello, World"应用里,这个文件被忽略了,因为你直接在代码编写布局了。这是为了让你更了解Android框架,你应该总是创建XML布局文件,而不是在代码里面编写UI。下面的步骤将指导你怎么使用XML布局文件。

1.  在Eclipse Package Explorer里面,打开res/layout下面的main.xml(一旦打开,你可能需要点击窗口下面的"main.xml"选项卡来浏览XML源文件)。将main.xml内容修改为:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/textview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:text="@string/hello"/>

保存文件.

2. 在res/values下面,打开strings.xml。这里你应该保存用户界面里面所有默认的文本字符串,ADT已经为你创建了两个字符串资源:hello和app_name,修改文件如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello, Android! I am a string resource!</string>
    <string name="app_name">Hello, Android</string>
</resources>

3. 现在打开并修改HelloAndroid.java文件如下:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}

现在不再传递一个View对象给setContentView()了,而是布局资源的一个引用。这个布局资源的根据R.layout.main来指定,它代表着res/layout/main.xml。ADT自动在R.java里创建这个引用。

现在重新运行你的应用,因为你已经启动了一个运行配置项目,你所要做的就是直接点击绿色的箭头图标来运行引用,或者选择Run > Run History > Android Activity.

注意: 你可能需要解锁模拟器的屏幕,就像你解锁手机屏幕一样。

R class

打开gen下面的R.java:

package com.example.helloandroid;

public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
    }
    public static final class id {
        public static final int textview=0x7f050000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
}

R.java包含了所有资源的索引。你在代码里面使用这个索引来使用资源。

你的文件看起来可能有些不一样(也许16进制数字不一样)。现在,看看类里面的名字"layout"和它的成员"main"。ADT发现XML布局文件的名字是main.xml,因此为它创建了一个类来索引它。如果你添加其他资源,你会看到R.java会自动添加上它的索引。

你永远不能手动修改这个文件。


调试你的工程

ADT和Eclipse调试器结合得非常完美。为了演示如何调试,在代码里面加入一个bug,修改HelloAndroid.java如下:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;

public class HelloAndroid extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Object o = null;
        o.toString();
        setContentView(R.layout.main);
    }
}

这个修改简单地引发一个NullPointerException异常。重新运行应用,你会看到:

hello_world_8

点击"Force Quit"结束应用,并关闭模拟器窗口。

为了更多地了解这个错误,在代码行Object o = null;设置一个断点。然后选择Run > Debug History > Hello, Android 进入调试模式。应用会重启模拟器,但是这次它将停在你设置断点的地方,现在你就能一步步调试你的代码了,就跟你调试其他非Android程序一样。

hello_world_9

posted on 2011-12-05 21:34  OnionD  阅读(325)  评论(0编辑  收藏  举报

导航