第五章应用:Hello World!——上

第五章应用:Hello World!——下

还是Hello World!

    本节中,你会创建另一个Hello WorldAndroid应用。然而这次你是用代码编写UI,而不是用xml文件——实际上你会做更多的工作。第一步是移除main.xml中的TextView代码。下面是TextView的代码部分。删除它,基本上使你的应用变成一个空壳。

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="Hello World, HelloWorldText"

/>

在你移除TextView代码后,你的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"

</LinearLayout>

现在你有了一个干净的main.xml文件,也就是一个干净的应用空壳,你可以添加在屏幕上显示“Hello Worldwide!”的代码。打开HelloWorldText.java文件,移除下面的行:

setContentView(R.layout.main);

本行用setContentView()函数将main.xml文件提到屏幕。因为你不用main.xml文件定义你的TextView,你也不会让它出现在你的视野。相反,你会通过代码构建TextView

下一步是导入从android.widget中导入TextView包。这会让你访问TextView,并让借助它创建你的示例。将这段代码放到HelloWorldText.java文件的顶部, import声明是

import android.widget.TextView;

现在创建一个TextView实例。通过创建TextView实例,你会用它将文本输出到屏幕上而不是直接修改main.xml。在onCreate()声明触发之后,放上下面的代码:

TextView HelloWorldTextView = new TextView(this);

上面一行通过设定一个新的TextView,创建了名为HelloWorldTextViewTextView实例,然后实例化了HelloWorldTextView,新的TextView在这里被实例化了。

现在定义了TextView,你可以在上面添加文本了。下面一行代码就在TextView上设置了“Hello World!”文本。

HelloWorldTextView.setText("Hello World!");

本行设置了你的TextView中的文本。setText()函数让给TextView指定一个字符串。

你已经创建了包含你想要展示的信息的TextView。然而,仅仅在TextView上传递“Hello World!”并不会显示到屏幕上。如前面提到的,你需要设定ContentView向屏幕展示内容。你必须用下面的代码设定TextView内容,并将它展示到屏幕上。

setContentView(HelloWorldTextView);

  研究该行,你会发现你将TextView传递给了setContentView。前三行代码组成了你的Hello World!应用。你创建一个TextView,为它指定文本,然后将它设置到屏幕上。从各方面来看,这一点儿都不复杂。

你的HelloWorldText.java文件的完整内容应该如下:

package android.programmers.guide;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class HelloWorldText extends Activity {

      /** Called when the activity is first created. */

      @Override

      public void onCreate(Bundle icicle) {

             super.onCreate(icicle);

             /** Hello World JFD */

             /** BEGIN */

             /** Create TextView */

             TextView HelloWorldTextView = new TextView(this);

             /** Set text to Hello World */

             HelloWorldTextView.setText("Hello World!");

             /** Set ContentView to TextView */

             setContentView(HelloWorldTextView);

             /** END */

      }

}

现在在Android模拟器中,编译并运行你的新Hello World!应用。选择 Run|Run或者按CTRL-F11组合键在Android模拟器中启动应用。下面的插图展示了你的Hello World!应用的结果。

第五章应用:Hello World!——上

你已经创建了你的第一个完整的Android Activity。这个小项目展示了一个相当普通的Hello World!应用的执行。你为活动的内容视图设定一个TextView,然后向Android模拟器中的手机屏幕显示“Hello World!”信息。下面一节展示一种不同的利用图片执行Hello World!的方式。

使用图像的Hello World!

本节,你会利用Hello World!应用,进一步了解一种相对平常的编程实践:显示图片。没有图形展示,现代的计算机显示器会变得非常无趣。这些图形显示中心能够往屏幕上发送图像。

五年前,手机显示图片非常麻烦。作为现代的PC用户,处理图片是我们习以为常的事情。我们每天都看各种类型的窗口,却不会想到他们其实是发送到屏幕上的图片而已。这个版本的Hello World!应用会在屏幕上显示一个图片来表示“Hello World!”。

对于该应用,利用新建Android项目向导来创建一个新项目,并命名为HelloWorldImage,如下所示:

第五章应用:Hello World!——上

应用项目创建之后,浏览并从main.xml中移除TextView代码,保证你有一个空项目。如果你不移除这些代码,最后还会是一个基于文本的Hello World!项目。

在你开始写代码之前,你需要一个展示的图片。在图形程序中创建一个小图片。简单起见,我选择Microsoft Paint,但是任何程序都能够为你提供你需要的图片。我用的图片是:

第五章应用:Hello World!——上

将你的图片命名为helloworld.png,并把它保存到%workspace%/HelloWorldImage/res/

drawable目录。

在你将图片复制到正确的目录之后,刷新项目。helloworld.png图片就会出现在你的项目视图中,在drawable目录,如下所示:

第五章应用:Hello World!——上

打开R.java,浏览它的代码。Eclipse已经为你的helloworld.png增加了一个指针。你的R.java文件类似这样:

/* AUTO-GENERATED FILE. DO NOT MODIFY.

*

* This class was automatically generated by the

* aapt tool from the resource data it found. It

* should not be modified by hand.

*/

package android_programmers_guide.HelloWorldImage;

public final class R {

public static final class attr {

}

public static final class drawable {

public static final int helloworld=0x7f020000;

public static final int icon=0x7f020001;

}

public static final class layout {

public static final int main=0x7f030000;

}

public static final class string {

public static final int app_name=0x7f040000;

}

}

有了一个可以起步的空应用和一个你可以处理的图片,你就可以开始添加你的代码了。你可以从两方面浏览这个应用:基于XMLUI和基于代码的UI

基于代码UI Hello World

假设你能理解HelloWorldText的解决方案,该版本的Helloworld!会非常熟悉。开始你需要导入展示图片的包。而文本显示使用的是TextView,图片显示使用的是ImageView。一次你需要导入ImageView包。如同TextViewImageView也包含在android.widgets:

import android.widgets.ImageView;

导入包后,你可以创建你的ImageView应用然后显示到屏幕上。实例化ImageView与实例化TextView相同;创建一个ImageView实例,使用方法如下:

ImageView HelloWorldImageView = new ImageView(this);

下一行是ImageViewTextView的不同之处。该步骤包含了设定你想显示的内容。在TextView的例子中,你使用setText()TextView的文本设置成“Hello World!”。虽然ImageViewTextView都是从View衍生而来,但他们仍然不同,因此需要不同的方法。很显然,你不会在ImageView中使用setText()。你需要用setImageResource(),来在你的ImageView中设定图片。如下所示,从R.javasetImageResource()的手柄传递helloworld.png。(手柄的语法就是R.drawable.helloworld):

HelloWorldImageView.setImageResource(R.drawable.helloworld);

最后,你必须设定ContentView才能将图片输出到屏幕。如图你对TextView的做法一样,给ContentView传递ImageViewContentView的任务就是将对象输出到屏幕。

setContentView(HelloWorldImageView);

你的HelloWorldImage.java的最终文件如同这样:

package android_programmers_guide.HelloWorldImage;

import android.app.Activity;

import android.os.Bundle;

import android.widget.ImageView;

public class HelloWorldImage extends Activity {

/** Called when the activity is first created. */

Chapter 5: Application: Hello World! 77

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

/**Hello World Image JFD*/

/**BEGIN */

/**Create the ImageView */

ImageView HelloWorldImageView = new ImageView(this);

/**Set the ImageView to helloworld.png */

HelloWorldImageView.setImageResource(R.drawable.helloworld);

/**Set the ContentView to the ImageView */

setContentView(HelloWorldImageView);

/**END */

}

}

编译HelloWorldImage,并在Android模拟器中运行。你的应用应该像下面的图例中所示:

第五章应用:Hello World!——上

下一节,你还会展示helloworld.png,但是这次是使用XML而不是代码。

基于XML UI Hello World

本节为你区分基于XMLUI和基于代码的UI展示图片的流程,进行了很好的比较。就像你看到的一样,使用main.xml向屏幕发送图片的流程,和使用基于代码的UI,需要的代码量大体相当。然而这两种流程的语法不同。

通过同一个项目的最后一个例子,从HelloWorldImage.java文件中移除TextView代码。空文件此处所示:

package android_programmers_guide.HelloWorldImage;

import android.app.Activity;

import android.os.Bundle;

public class HelloWorldImage extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle icicle) {

super.onCreate(icicle);

}

}

现在你有了个干净的面板,移到main.xml中。你需要添加一个ImageView的定义。从给你的main.xml文件添加空的ImageView标签开始:

<ImageView

/>

你需要编辑ImageView的四个属性:android:idandroid:layout_widthandroid:layout_height、和android:src。你把这些属性放到标签中,他们会控制标签在屏幕上的现实方式。

android:id属性是设置ImageView的标识。android:id属性用来和你的代码中的ImageView关联。使用@+id/<name>语法给ImageView配置一个可以在以后使用R.layout.imageView纠正的标识:

android:id="@+id/imageview"

这一行是插入一个自动生成的id@+id,插入到在名字imageview下的R.java文件。

下面两个你必须定义的属性是:layout_widthlayout_height。这些属性控制图片填充屏幕的方式。当为这些属性分配值时,有两个选项可以选择。fill_content值在可见范围内使图片填充屏幕。wrap_content值保持图片的原始大小,可能处理时会失去一些图片精确度。例如,使用wrap_content

android:layout_width="wrap_content"

android:layout_height="wrap_content"

最后的属性你需要分配的是相对最重要的:android:src。这个属性指定你想在视图中显示的图片。例如,将该属性指定为drawable/helloworld图片:

android:src="@drawable/helloworld"

你的整个ImageView标签应该像这样:

<ImageView android:id="@+id/imageview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/helloworld"

/>

最后,在图片显示到视图之前,你必须将main.xml传递到HelloWorldImage.java中的setContentView

setContentView(R.layout.main);

编译并运行HelloWorldImage。结果如下面的插图所示:

第五章应用:Hello World!——上

在你结束本章前,再做一件事。回到main.xml,将层从warp_content变成fill_content。当你结束时,你的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"

<ImageView android:id="@+id/imageview"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:src="@drawable/helloworld"

/>

</LinearLayout>

再次运行应用,看看wrap_contentfill_content之间的差别。你的新应用运行时,应该如下所示:

第五章应用:Hello World!——上

下一节从命令行编程出发,会对Hello World!应用做进一步的研究。

 

 

专家答疑

问:Android是否像其它大部分API一样,拥有一个label或者LabelView吗?

答:没有。所有文本都是通过TextView定义的。你可以像一些人一样,创建一个自定义的如同label功能的View,并将其命名为LabelView

问:通过<application>.java来创建视图main.xml有优势吗?

答:当在用一个创建其它文件时没有记载或过程文件的时候,就会有一个关键优势:使用main.xml,你会有大量的预定义的Activity视图。然后再你的代码中,你可以根据所需从一个视图跳到另一个视图,而不用人工编码创建。