您的位置:首页 > 其它

创建你的第一个安卓应用4 - 第四课 - 启动另外一个activity

2014-07-29 19:09 393 查看
原文地址:http://my.oschina.net/danielzz/blog/210507

在完成上节课后,你有了可以显示包含一个文字输入框和一个按钮的activity(一个屏幕)的应用。在这节课中,你将在“MainActivity”类中添加一些代码,使得在用户点击“Send”按钮时,启动另外一个新的activity。

响应“Send”按钮

要响应此按钮的“on-click”事件(event),打开“fragment_main.xml”布局文件,然后在“<Button>”节点内添加“android:onClick”属性。

?
android:onClick”属性的值,“sendMessage”,是当用户点击按钮时系统将会调用的你的activity中的一个方法(method)。

打开“MainActivity”类(在项目中的“src/”目录下),然后添加相应的方法:

?
为了是系统可以匹配此方法和“android:onClick”所指定的方法名,方法签名(signature)必须如上所示。更明确的说,此方法必须:

是公开的(public)

返回值是“void”

有且仅有一个“View”类型的参数(这将是点击事件所发生的View

下一步,你将读取文字输入项中的内容,并且发送读取的文本到另一个activity。

创建一个“Intent”(意图)

Intent”(意图)是提供运行时绑定不同构件(比如,两个activities)的对象。“Intent”表述一个应用“意图去做某件事”。你可以用“Intent”实现各种各样的任务,但是最经常的是用来启动另一个activity。

在“sendMessage()”方法内部,创建一个启动名为“DisplayMessageActivity”的activity的“Intent”:

?
这需要你导入(import)“Intent”类:

?
提示:在Eclipse中,同时按下“Ctrl + Shift + O”可以自动导入缺失的类(在Mac中是“Cmd + Shift +O”)。

此处用到的构造函数(constructor)需要两个参数(parameters):

第一个参数为一个“Context”类型的对象(这里使用了“this”对象,因为“Activity”类是“Context”类的子类)

以及需要系统将此“Intent”递送的到的应用构件(component)的类(Class)(此例中为要启动的activity的类)

注意:如果你在使用Eclipse或者其他的集成开发环境,引用“DisplayMessageActivity”到导致一个错误提示,因为这个类还不存在。目前,先忽略这个错误;你将很快建立此类。

一个“Intent”不仅能够让你启动一个“activity”,他同时还可以携带数据集(bundle)到另一个“activity”。在“sendMessage()”方法内,使用“findViewById()”方法获取“EditText”对象,然后把它的文本值添加到intent中:

?
注意:现在,你需要导入“android.widget.EditText”类。你很快会定义“EXTRA_MESSAGE”常量。

一个“Intent”可以通过一组叫做“extras”(额外数据)的键值对(key-value pairs)来携带多种类型的数据。“putExtra()”方法接收第一个参数作为键值,第二个参数为对应的数据值。

为了使其他的activity可以查询这些额外数据(extra data),你应该使用一个公有常量(public constant)来定义此intent的键值。因此,在“MainActivity”类的最开始,添加“EXTRA_MESSAGE”的定义:

?
一般来说,使用你的应用的包名称作为intent额外数据(extra)的键值前缀是一个好的习惯做法。如果你的应用要和其他应用交互,这样可以保证他们是唯一的。

给其他应用发送intent

我们此节课创建的intent叫做“显式intent”(explicit intent),因为这个“Intent”指定了需要发送到的应用构件(app component)。同时,intend也可以是“隐式”的(implicit),此类“Intent”不会指定一个确定的构件(component),但是允许安装在当前设备上的任何应用响应此intent,只要它们可以满足在“Intent”的不同参数中指定的各种元数据规范(meta-data
specification)。更多的信息,请参阅课程“Interacting with Other Apps”。

启动第二个Activity

要启动一个activity,调用“startActivity()”方法并且传入你的“Intent”作为参数。系统接收到这个调用后,会启动一个在此“Intent”中指定的“Activity”的实例(instance)。

随着新的代码加入,完整的“sendMessage()”方法如下,此方法将被“Send”按钮调用:

?
为了使之工作,现在,你需要创建“DisplayMessageActivity”类。

创建第二个Activity

在Eclipse中创建一个新的activity:

点击工具栏上的“New”



在所显示的窗口中,打开“Android”目录,然后选择“Android Activity”。点击“Next”。

选择“BlankActivity”然后点击“Next”。

填入activity的详细信息:

Project(项目):MyFirstApp

Activity Name(activity名称):DisplayMessageActivity

Layout Name(布局名称):activity_display_message

Fragment Layout Name(“碎片”名称:译者注:“碎片”是Android的新特性,以后将会介绍):fragment_display_message

Title(标题):My Message

Hierarchial Parent(层次关系中的父构件):com.example.myfirstapp.MainActivity

Navigation Type(导航类型):None

点击“Finish”。



图示1:Eclipse中的新建activity向导

如果你在使用其他的IDE或者命令行工具,在项目的“src/”目录中,创建一个名为“DisplayMessageActivity.java”的文件,使之与已存在的“MainActivity.java”在一起。

打开“DisplayMessageActivity.java”文件。如果你是使用Eclipse创建的:

这个类已经包含了一个“onCreate()”方法的实现。你随后将更新这个方法的实现。

其中还有一个“onCreateOptionsMenu()”方法的实现,但是在此应用中,你不需要它。所以你可以删除它。

其中还有一个“onOptionsItemSelected()”方法的实现,此方法处理操作栏(action bar)中的“向上”(Up)行为。保留原样。

其中还有一个继承自“Fragment”的“PlaceholderFragment”类。在此activity的最终版本中,你不需要这个类。

“Fragments”(碎片,这个也是Android的专用名词,以后将不翻译)可以将应用的功能和用户界面(UI)分解为可重用的模块。需要“fragment”的更多信息,请参阅“Fragments API Guide”。此activity的最终版本将不使用fragment。

现在的“DisplayMessageActivity”类应该如下:

?
如果你使用Eclipse之外的其他IDE,使用上述代码更新“DisplayMessageActivity”类。

所有“Activity”的子类必须实现“onCreate()”方法。当系统创建一个此activity的新实例的时候,将调用此方法。这个方法就是你使用“setContentView()”方法定义activity布局和为activity的各个构件(components)初始化设置(initial
setup)的地方。

注意:如果你使用Eclipse之外的IDE,你的项目没有“setContentView()”所需的“activity_display_message”布局文件。因为你随后会更新此方法清且不会使用此布局,所以这不会成为问题。

添加标题字符串(string)

如果你使用Eclipse,你可以直接跳到下一章节,因为创建activity模板为新的activity提供了标题字符串。

如果你使用Eclipse之外的IDE,在“strings.xml”文件中添加新activity的标题:

?

添加到清单文件(manifest)

所有的activity必须使用“<activity>”元素在“AndroidManifest.xml”文件中声明。(译者注:manifest在Java以及Android编程中都是常用的术语,此类文件一般是用来对资源和代码进行说明和描述。)

如果你使用Eclipse创建此activity,它会创建一个缺省项。如果你使用其他IDE,你需要自己添加此manifest项。它应该如下:

?
android:parentActivityName”属性声明此activity在应用的逻辑继承关系上的父activity。系统通过这个值来实现缺省的导航行为,比如在Android 4.1(API level 16)以及更新版本中的“向上导航”(Up
navigation)。你可以使用“Support Library”(兼容支持类库,译者注:这个类库提供了让旧版本的Android支持新的功能的一系列帮助类和方法)并且添加如上所示的“<meta-data>”元素的方法在旧版Android中提供同样的导航行为。

注意:你的Adroid SDK应该已经包含了最新版本的Adroid Support Library。它包含在ADT捆版软件包中,但是如果你使用其他IDE,你应该已经在“Adding Platforms and Packages”这个步骤安装了它。当使用Eclipse的模板时,“Support
Library”会自动被添加到你的项目中(你可以在“Android Dependencies”列表中看到此类库的jar文件)。如果你不使用Eclipse,你需要手动添加此类库到你的项目中——跟随“setting up the Support Library”向导去做,然后返回这里。

如果你使用Eclipse开发,你现在可以运行这个应用,但不会有什么特别的发生。点击“Send”按钮,可以启动第二个activity,但是这个activity使用创建模板中提供的缺省“Hello World”布局。你将很快更新这个activity使用一个自定义的文本视图组件(text view)来取而代之,所以,如果你使用其他IDE,不要担心这个应用还不能被编译通过。

接收Intent

每个Activity都是被一个Intent所调用的,不管用户是如何被导航到那里的。你可以调用“getIntent()”方法来获得启动你的activity的Intent,然后获取包含于之中的数据。

在“DisplayMessageActivity”类的“onCreate()”方法中,获取这个intent并且读取“MainActivity”发送的消息。

?

显示消息

要在屏幕上显示这则消息,需要创建一个“TextView”部件(widget)然后通过“, int, int)]setText()”方法设置它的显示文字。因此,通过“setContentView()”方法,将“TextView”添加到布局中作为activity的根视图元素。

完整的“DisplayMessageActivity”的“onCreate()”方法如下:

?
你在你可以运行应用了。当它开启,在文本输入项中键入一条消息,点击“Send”按钮,之后,这条消息将显示在第二个activity中。





图示2:在Android 4.4中,完成版应用中的两个activity。

如是,你已经完成了你的第一个Android应用(app)!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐