Android训练课程(Android Training) -
构建你的第一个应用(app)
欢迎来到安卓开发!
这个课程教你如何构建你的第一个应用。你讲会学到如何去创建一个安卓工程和启动一个可以调试的应用的版本。你将会学到一些安卓设计的基础,包括如何构建一个简单的用户界面和处理用户输入。
在你开始这个课程之前,确保你已经有了安卓开发环境并设置好,你需要:
1.下载安卓开发包(Android SDK)
2.为你的Eclipse安装ADT插件(如果你使用Eclipse集成开发环境的话)
3.使用SDK管理器(SDK manager)下载最新的SDK工具盒平台
注意:在你开始本课程之前,确保你安装了最近版本的ADT插件和安卓SDK。这个课程的进度描述不适用于早期的版本。
如果你还没有完成这些任务,开始下载 Android SDK 并且跟随安装步骤。一旦你已经完成了安装,你就准备好开始这个课程了。
这个课程使用了一种训练格式,就是不断的构建一个简单的app的方式,讲会教会你一些关于安卓开发的基础概念,跟随每一个步骤是很重要的。
开始第一课 Start the first lesson ›
创建一个安卓项目
一个安卓项目包含了由源代码组成的的你的应用的全部文件。安卓开发包SDK工具可以很容易的创建一个由默认项目文件夹和文件组成的新的安卓项目。
这节课展示了,如何创建一个新的项目,你可以选择两种方式之中的一种:使用带有ADT插件的Eclipse或者使用SDK工具在命令提示符下。
注意:你应该已经准备好了并安装完成安卓SDK,如果你使用Eclipse,你应该已经安装好ADT插件(22.6.2或者更高版本)。如果你还未做好这些,请在开着这节课的学习之前,跟随指南去安装安卓开发工具包 Installing the Android SDK。
使用Eclipse创建项目
1.在工具栏上点击 New
2.在出现的窗口上,打开 Android 文件夹,选择 Android Application Project ,并且点击 Next。
3.填写出现的表单内容:
Application Name 应用程序的名称。是向使用者展示的应用程序的名称。在这个项目里,使用“My First App”。
Project Name 项目名称。是你的项目的文件夹的名称,也是在Eclipse里看到的名称。
Package Name 程序包名。是你的程序包的命名空间(和Java编程语言的包的概念是相同的规则)。你的包名必须是在你的安卓系统的所有的包中是唯一的。因此,一般最好的情况是,你使用一个你的组织或者发布者实体的保留域名作为开头,在这个项目里,你可以使用像“com.example.myfirstapp”,然而,你不能在谷歌市场(Google Play)发布你的使用“com.example”命名空间的应用。
Minimum Required SDK 最小要求SDK 是你的应用支持的最低安卓系统版本。使用API 级别来指定。为了支持更多可能的设备,你设置成你的应用可以提供的核心性能集合支持到的最低版本。如果你的应用的一些特性可能仅仅在较新的版本上,并且它不是在你的所有应用特性中起到决定性作用的话,你可以在它运行在它支持的版本上时才启用它。(更多的讨论请阅读 支持不同平台的版本 Supporting Different Platform Versions). 在本项目中,我们将这些设置保留为默认值.
Target SDK 目标SDK 指示了你测试过的你的应用可以支持的最高版本的安卓系统(仍然是用API级别指定)
当一个新的安卓版本变得可用,你应该测试你的应用在新的安卓版本并且更新这个值去匹配最新的API级别,这样你能获得新平台特性的最大效益。
Compile With 编译版本 是你讲编译你的应用程序而使用的平台版本。 默认情况下,这将被设置为你手中的可用SDK版本中的最新版本(它可能是安卓4.1或者更高;如果你还没有任何一个可用版本,你必须使用SDK Manager安装一个)。你仍然可以构建你的应用去支持较旧的版本,但是设置编译目标为最新的版本将使得你可以启用新的特性和优化你的应用程序来获得在最新设备上的更好的用户体验。
Theme 主题 指示了你的应用的界面风格。你可以让它保持原样。
点击 Next 进入下一步。
4.在接下来屏幕上去配置这个项目,保留默认选项并点击 Next 下一步。
5.在接下来的屏幕可以帮助你创建一个启动图标。
你可以使用多种方式自定义一个图标,和使用工具创建一个适合多种屏幕密度的图标。在你发布你的应用之前,你应该确定你的图标符合在 图标设计指南 Iconography 声明中的规范。
点击Next 下一步。
6.现在你可以选择一个Activity(页面)模板来开始构建你的应用。对于这个项目,选择 BlankActivity 空模板 和点击 Next 下一步。
- 保留Activity所有的详细设置为默认状态,并点击 Finish 完成。
你的项目现在只是一个基础的“Hello World”应用,它包含一些默认文件。要启动这个应用,继续学习下一节课next lesson.。
你的项目现在只是一个基础的“Hello World”应用,它包含一些默认文件。要启动这个应用,继续学习下一节课next lesson.。
使用命令提示行工具创建项目
如果你没有使用一个带有ADT插件的Eclipse集成开发环境,你可以 使用SDK工具从一个命令提示行工具创建你的项目 来替代它。
1.改变你的文件夹到安卓SDK的安装目录 tools/ 下。
2.执行
android list targets
这将打印出你的SDK中你已经下载的所有可用的安卓平台列表。找到你想用来编译你的APP的平台。记录下目标id。我们建议你选用最高级别的可用版本。你仍然可以构建你的APP支持更旧的版本,但是设置编译目标(build target)为最新的版本允许你在最新的设备上优化你的app。
如果你没有看到任何内容被列出,你需要使用安卓SDK manager去安装一些。请看 Adding Platforms and Packages.
3.执行
android create project --target <target-id> --name MyFirstApp \
--path <path-to-workspace>/MyFirstApp --activity MainActivity \
--package com.example.myfirstapp
使用列出的目标(上一步获得的)替换<target-id>,并且使用你想要保存你的项目的文件夹位置替换<path-to-workspace>。
提示:请添加 platform-tools/ 和 tools/ 墓道你的PATH 环境变量。
NEXT: RUNNING YOUR APPLICATION 下一课:启动你的应用程序
启动你的应用
如果你跟随上一课的内容创建了一个安卓项目,它包含了一些像“Hello World”这样的默认文件,允许你直接启动这个应用。
如何启动你的应用依赖这两项:你是否拥有一个真实的安卓动力的设备,和你是否使用Eclipse。这节课将将向你展示如何在真实设备和模拟器中安装和启动你的应用,有两种方式:使用Eclipse或者命令提示符工具。
在启动你的应用之前,你应该了解一些你的安卓项目里的文件和文件夹:
AndroidManifest.xml
清单文件,描述了应用的基础特性 ,和定义每一个最近。随着你阅读更多的训练章节,你将会学到很多的在这个文件里的声明(译者注:定义组件等)
在你的清单文件中应该包含的一个重要的元素是 <uses-sdk> ,它使用 android:minSdkVersion 和 android:targetSdkVersion 声明了你的应用的兼容性。在你的第一个应用中,它看起来是这样的:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" ... >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="19" />
...
</manifest>
你应该总是设置 android:targetSdkVersion 为尽量高的版本,并且在相应的平台版本测试你的应用。更多的信息请阅读 Supporting Different Platform Versions.
src/
你的应用程序的主要源代码文件存放在这里,默认情况下,包含了一个Activity的类,在通过点击图标后你的应用启动时它将被启动。
res/
包含许多子文件夹用于存放应用的资源文件,下面列出了一些:
drawable-hdpi/
一个文件夹,用于存放一些 被设计用于高密度(hdpi)的屏幕的可绘制的对象(比如位图)。其他的drawable文件夹也包含了一些 适用于其他屏幕密度而设计的资源材料。
layout/
一个文件夹,用于存放 定义你的应用程序的界面 的文件。(译者注:我们常常成为页面布局文件)
values/
一个存放了许多xml 文件的文件夹,包含了很多资源文件,比如 字符串(string) 和颜色(color)定义。
当你构建并运行这个默认的应用,一个默认的Activity类将启动,和加载一个包含了“hello world”的布局文件。这个结果一点也不让人兴奋,但是重要的是 你明白了如何在开始开发之前去启动一个应用。
在真实设备上运行
如果你拥有一个安卓动力的设备,在这里展示了你如何安装和启动你的应用:
1.使用USB线将你的设备插入到你的开发机器(译者注:可能是电脑)上,如果你使用window是开发,你可能需要为你的设备安装适当的USB驱动。获得安装驱动的帮助请阅读文档 OEM USB Drivers 。
2.在你的设备上启用USB debugging(USB调试)模式
在很多运行在安卓3.2或者更旧的版本上的设备,你可以在选项设置里找到: 设置>应用程序>开发者
在安卓4.0或者更新一些的版本,他存在于 设置>开发者选项
注意:在安卓4.0或者更新一些的版本 开发者选择 默认是隐藏的。要想使它可见, 在 设置>关于设备 下,并且点击 基带版本 多次。返回上一屏幕去寻找 开发者选项
在Eclipse中启动应用:
注意:我们常常使用Eclipse的英文版本,对于Eclipse里的一些英文都不在翻译,以应对读者找不到按钮的情形。
1.打开一个你项目中的文件,并且点击工具栏中的 Run。
2.在出现的 Run as 窗口 里,选择 Android Application 并且 点击 OK。
Eclipse 安装你的应用到手机里并且启动它。
或者在命令提示行里启动它
1.更改文件夹路径到 你的安卓项目的根目录 下,并且执行:
ant debug
- 确保安卓SDK 的platform-tools/ 文件夹被包含在你的环境变量PATH里,这时执行:
adb install bin/MyFirstApp-debug.apk
- 在你的设备上,定位到 MyFirstActivity 并且打开它。
这些就是如何构建和在一个真实设备上启动你的应用。要开始开发,继续到下一课程 next lesson。
在模拟器中启动
无论你使用Eclipse 或者命令提示行,要启动你的应用,你必须先创建一个Android Virtual Device (AVD),一个AVD是一个配置好的安卓模拟器,它运行你模拟不同的设备。
创建一个AVD:
1.启动安卓模拟设备管理器(Android Virtual Device Manager):
a. 在Eclipse,点击工具栏中的Android Virtual Device Manager
b. 在命令提示行里,更改目录到 <sdk>/tools/ 并且执行
android avd
- 在Android Virtual Device Manager 面板里,点击 New。
3.填写AVD的详细信息,设置name名称,平台目标platform target,一个存储卡大小SD card size,一个皮肤skin(默认HVGA).
4.点击 Create AVD
5.从 Android Virtual Device Manager 中选择一个AVD,并且点击 Start 开始。
6.在模拟器启动后,解锁模拟器屏幕。
在Eclipse中启动这个应用
1.打开一个你项目中的文件,并且点击工具栏中的 Run。
2.在出现的 Run as 窗口 里,选择 Android Application 并且 点击 OK。
Eclipse安装这个应用到你的AVD,并启动它。
或者再命令提示行下启动它:
1.更改文件夹路径到 你的安卓项目的根目录 下,并且执行:
ant debug
2.确保安卓SDK 的platform-tools/ 文件夹被包含在你的环境变量PATH里,这时执行:
adb install bin/MyFirstApp-debug.apk
3.在你的设备上,定位到 MyFirstActivity 并且打开它。
这些就是如何构建和在模拟器中启动你的应用。要开始开发,继续下一课程 next lesson。
构建一个简单的用户界面
2014-10-28 张云飞VIR 翻译自: https://developer.android.com/training/basics/firstapp/building-ui.html#Button
安卓的图形用户接口(界面)是通过使用一个由视图(view)和视图集合(ViewGroup)对象组成的层级结构来构建的。View对象是一些常见UI组件,比如按钮,文本框,ViewGroup对象是一些不可见的视图容器,它定义了子视图如何摆放,比如在一个表格里或者一个垂直列表。
安卓提供了一个XML词汇表,它于view和ViewGroup的子类是一致的,这样你可以在XML中使用界面元素的层级来定义你的界面。
图一. 说明了 在布局中,ViewGroup对象形式如何分支,和包含其他的视图对象。
在这节课,你将创建一个XML布局,它包含了一个文本区和一个按钮。在后面的课程中,在按钮被按下后你将作出反应,并发送文本区的内容到其他activity。
创建一个线性布局(Linear Layout)
在你的项目文件夹 res/layout/下,打开 fragment_main.xml
注意:在Eclipse,当你打开一个布局文件,你将先被展示一个视图布局的编辑器。这是一个编辑器,可以帮你以所见即所得的工具构建布局。在这节课,你将使用XML直接工作,这样,点击屏幕下方的fragment_main.xml 标签卡来打开一个XML编辑器。
当你创建这个项目是你选择了 BlankActivity (空的activity)这个模板,它包含了 fragment_main.xml 这个文件,RelativeLayout 是它的根视图,并且包含了一个TextView子视图。
第一步,删除 <TextView> 元素,并且更改 <RelativeLayout> 元素为 <LinearLayout>。这是,添加android:orientation 这个属性,并且设置值为“horizontal”。这个结果像下面这样:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
</LinearLayout>
LinearLayout 是一个View group(一个ViewGroup的子类),它以垂直或者水平方向两种之一的方式摆放它的子视图,使用 android:orientation 属性来指定方向。每一个 LinearLayout 的子视图出现在屏幕中的顺序和它出现在XML中的顺序一致。
另外的两个属性, android:layout_width 和 android:layout_height,对所有的视图来说都是必须的,为了指示它们的尺寸。
因为 LinearLayout 是布局的根视图,在它的宽度和高度都设置为“match_parent”,它将填满这个应用的整个可用的屏幕区域。这个值定义了视图如何展开它们的宽度和高度去匹配它们的父控件的宽度和高度。
关于布局属性的更多内容,请阅读 Layout 指南。
添加一个文本框
为了创建一个用户可编辑的文本区,在 <LinearLayout>.下添加一个 <EditText>元素。
像每个视图View一样,你必须定义固定的XML属性去指定EditText对象的属性。下面演示了 你如何在<LinearLayout> 元素内定义它:
EditText android:id="@+id/edit_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
关于这些属性:
android:id
它提供了这个视图的唯一标示符,通过它你可以再你的代码里引用该对象,比如去读取和操作这个对象(你将会在下一章节看到)
当你从XML中应用资源对象时,符号“@”是必须的。随后跟随着资源类型(在这里是id类型),一个斜线,这时再跟着一个资源名称(这里是叫edit_message)
在资源类型前面的“加号”,仅仅在你第一次定义资源ID的时候是必须的。在你编译你的程序时,SDK工具在你的项目的gen/R.java文件中使用ID的名称去创建一个资源ID,它引用到EditText元素。一旦你的资源ID使用这种方式声明过,其他应用到这个ID就不再需要“加号”了。只有当指定一个新的资源ID时,才需要使用“加号”,并且不需要具体的资源,比如字符串和布局。更多关于资源对象的内容请看侧边条。
android:layout_width 和android:layout_height
为了代替使用具体的尺寸来指定宽度和高度,“wrap_content”值指示了视图将会仅仅需要去适应视图的内容的大小。如果你使用"match_parent"来代替,这时 EditText元素将会填充满整个屏幕,因为它将会匹配它的父布局LinearLayout的尺寸。更多信息请阅读 Layouts 指南。
android:hint
当文本区是空得时候,这个磨人的字符串将会被显示。代替使用 “硬编码”(hard-coded)一个字符串作为值, "@string/edit_message" 这个值引用到一个在另外的文件中被定义的字符串资源。因为这个引用到一个具体的资源(而不是一个标示符),它不需要使用“加号”。然而,因为你过去还未定义一个字符串资源,你将会首先看到一个编译错误。在下一章节通过定义字符串的方式你将会修复这个错误。
注意:字符串资源具有和元素ID相同的名称edit_message。然而,引用到资源总是通过资源类型的方式(比如id或者string)具有周期的看,于是,使用相同的名称不会导致冲突。
关于资源对象(resource objects)
一个资源对象简单来说就是一个唯一的整数名称,它关联到一个应用程序的资源,比如一个位图,布局文件,或者字符串。
每一个资源都有一个对应的在你项目里gen/R.java里声明的 资源对象。你可以使用在 R 类里的对象名称去引用你的资源,比如当你为android:hint 属性指定一个字符串的值时。你也可以创建任意的资源ID,并通过android:id来关联到一个视图控件,它使得你可以从其他代码里应用这个视图控件。
每次你编译你的应用,SDK工具都会生产R.java文件,你不能手动修改这个文件。更多信息请参阅 Providing Resources.
添加字符串资源
当你需要添加文本到用户界面时,你应该总是以资源的方式指定每一个字符串。字符串资源使得你可以在一个位置里管理你所有的界面文本,这使得很容易找到和更新字符串文本。外部化(译者注:把...放到外部)的字符串通过为每一个字符串资源提供可供选择的定义的方式,使得你可以根据不同的语言来本地化你的应用。
译者注:将所有的字符串资源放到单独的资源文件中,可以在不同的语言情况下切换不同的资源文件来实现国际化。
默认情况下,你的安卓项目包含了一个默认的字符串资源文件,它存放在 res/values/strings.xml. 添加一个字符串并且命名为“edit_message”,并且在“Enter a message.”位置上设置它的值。(你可以删除"hello_world"字符串)
当你在这个文件里时,同时为不久后可以要添加的按钮添加一个叫做“Send”的字符串,命名为"button_send".
string.xml的结果像下面这样:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">My First App</string>
<string name="edit_message">Enter a message</string>
<string name="button_send">Send</string>
<string name="action_settings">Settings</string>
<string name="title_activity_main">MainActivity</string>
</resources>
添加一个按钮
现在添加<Button>元素到你的布局文件里,它直接跟随在 <EditText>元素之后:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send" />
宽度和高度都被设置为"wrap_content",这样,按钮就会按照需要适应按钮的文本的大小。这个按钮不需要android:id属性,因为不需要在activity代码里引用。
让输入框填满屏幕宽度
这个布局是最近的设计,这样包括EditText和Button两个小组件仅仅按需要去适应他们的内容的大小,像图表2展示的这样:
图表2.EditText和Button小组件的宽度被设置为"wrap_content".
这个样子对于这个按钮还很好,但是对文本框就不那么好了,因为用户本可以输入一些更长一些的内容。那么比较好的情形是实用文本框填充满未使用的屏幕宽度。你可以再LinearLayout中使用 重要性 属性来做,这样你可以通过android:layout_weight 属性来指定。
weight的值是一个数字,它指示了每个视图可以占用的剩余空间的数量,相对的是兄弟视图占用的数量。这样的工作有点类似饮料配方里的成分数量:“2份的伏特加,1份的咖啡利口酒”,意思是 三分之二 的饮料是伏特加。比如,如果你让一个视图的weight是2而另一个是1,总数量是3,那么第一个视图填满2/3的剩余空间,而第二个视图填满仅剩余的部分。如果你添加了第三个视图并设置weight为1,这时,第一个视图(weight等于2)此事将获得1/2的剩余空间,同时剩下的两个各占1/4。
对所有的视图来说,默认的weight是0,那么,如果你为仅有的一个视图指定任何weight大于0的值,那么这个视图填满无论多少的剩余空间,知道所有的视图被分配他们需要的空间。这样,为了在你的布局里使EditText元素填满剩余的空间,给他一个weight等于1的值并且,让不为按钮设置任何weight。
<EditText
android:layout_weight="1"
... />
为了去改善布局的性能,当你指定了weight属性,你应该更高EditText的宽度为0(0dp)。设置宽度为0增进了布局的性能,因为使用"wrap_content"作为宽度需要系统计算得出一个基本上不相关的结果,因为weight值需要其他的宽度计算以填满整个剩余的空间。
<EditText
android:layout_weight="1"
android:layout_width="0dp"
... />
图表3 展示了当你为EditText元素分配所有的weight后的结果。
图表3. EditText组件被设置了layout weight,这样填满 LinearLayout.的剩余的空间。
下面是你完成后的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<EditText android:id="@+id/edit_message"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:hint="@string/edit_message" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send" />
</LinearLayout>
这个布局被应用在一个默认的Activity类中,这个类是当你创建项目时由SDK工具自动生成的,这样你现在可以启动这个应用看下结果:
在Eclipse,在工具栏里点击 Run 。
或者再命令提示行下,更改目录到你的项目的根目录,并执行:
ant debug
adb install bin/MyFirstApp-debug.apk
继续下一课程去学习 如何响应按钮的点击,从文本框读取内容,启动另一个activity,和更多。
张云飞VIR 于 2014-10-28 翻译自:https://developer.android.com/training/basics/firstapp/starting-activity.html#DisplayMessage
启动其他Activity
在完成了上节课后,你已经有了一个应用,它展示一个具有文本框和按钮的 activity(一个单页面).在这节课,你将添加一些代码到MainActivity,当用户点击了 发送Send 按钮将会启动一个新的Activity
响应Send按钮
要响应按钮的点击事件,打开fragment_main.xml 布局文件,并且添加 android:onClick 属性到<Button>元素:
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/button_send"
android:onClick="sendMessage" />
这个 android:onClick 属性的值是"sendMessage",这是你的Activity中的一个方法(method)的名称。当用户点击按钮时,系统将会调用它。
打开MainActivity 类(定位到项目的 src/ 目录下)并且添加相应的方法:
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
// Do something in response to button
}
为了让系统匹配到这个方法,方法的名称必须在 android:onClick中被指定为这个方法名称,方法的签名必须准确的像展示的一样。明确的,方法必须符合:
公开的。public
具有一个void返回值
具有一个 View作为参数,并且仅仅只有一个阐述(这将是那个被点击的view)
下一步,你将填充这个方法,读取文本框的内容并传递文本到另一个activity.
构建以个intent
一个Intent是一个对象,用以在两个分离的组件之间(比如两个 activity)提供运行时绑定。Intent呈现了一个应用 “想去做某事”。你可以使用intent处理多种多样的任务,但是大多的时候,它们常常用来启动其他的 Activity
在endMessage()方法内,创建一个Intent去启动一个叫做“DisplayMessageActivity:”的Activity:
Intent intent = new Intent(this, DisplayMessageActivity.class);
这需要你导入(import) Intent这个class
import android.content.Intent;
提示:在Eclipse,点击Ctrl + Shift + O 来导入丢失的类(在Mac下是Cmd + Shift + O)
这里使用的构造方法具有两个参数:
一个Context 上下文,是第一个参数(这是可用的,因为Activity类是Context的子类)
应用程序组件的类,系统将传送这个Intent(在这个情况下,Activity将会启动)
注意:引用 DisplayMessageActivity 将会产生一个错误,如果你使用一个IDE,比如Eclipse,因为这个类目前还不存在。现在先忽略错误,等下再创建它。
一个Intent不仅仅允许你去启动其他的activity,而且它还能携带一个包裹(bundle)的数据到activity。在sendMessage() 方法内部,使用 findViewById() 去获得 EditText 元素,并且添加它的文本的值到intent里。
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
注意: 你现在需要去导入android.widget.EditText的声明。一会再定义EXTRA_MESSAGE 常量。
一个Intent能够携带一个集合的以键值对的形式的多种数据类型,被称为 附加(扩展)数据。putExtra() 方法具有一个 键(key) 的名称作为第一个参数,和 值(value) 作为第二个参数。
为了在下一个 activity去查询这个扩展数据,你应该使用常量为intent的这个扩展数据定义一个key。这样添加 EXTRA_MESSAGE 定义到 MainActivity 的顶部:
public class MainActivity extends ActionBarActivity {
public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
...
}
使用你的应用的package name 作为前缀 来为intent的额外数据 去定义key,是个好的应用实践。这确保它们在和其他应用交互时是唯一的。
启动第二个Activity
要启动一个Activity,调用 startActivity() 并且把你的intent传递给它。系统收到这个调用并且启动一个这个Intent指定的Activity的的实例。
使用下面的代码,那个被Send按钮调用的 完整的 sendMessage() 方法 看起来是这样:
/** Called when the user clicks the Send button */
public void sendMessage(View view) {
Intent intent = new Intent(this, DisplayMessageActivity.class);
EditText editText = (EditText) findViewById(R.id.edit_message);
String message = editText.getText().toString();
intent.putExtra(EXTRA_MESSAGE, message);
startActivity(intent);
}
为了让这可以工作,现在你需要去创建 DisplayMessageActivity 类。
发送一个intent到其他的应用
在这节课里创建的intent是经过考虑的明确的intent,因为Intent指定了准确的应用组件,是intent可以被给与的组件。然而,intent可以是隐性的,在一些情况下,Intent不指定 渴望得到的组件,但是允许一些已经在设备中被安装的应用程序去响应这个intent,以 为了那个被指定多样的Intent参数的action 足够满意元数据规范的形式。更多信息请阅读Interacting with Other Apps 。
创建第二个Activity
使用Eclipse创建新的Activity
1.在工具栏点击 New 按钮
2.在出现的窗口里,打开Android 文件夹并选择 Android Activity,点击 Next
3.选择 BlankActivity ,点击Next
4.填充activity的详细内容:
Project: MyFirstApp
Activity Name: DisplayMessageActivity
Layout Name: activity_display_message
Fragment Layout Name: fragment_display_message
Title: My Message
Hierarchial Parent: com.example.myfirstapp.MainActivity
Navigation Type: None
点击 Finish.
如果你使用一个不同的集成开发环境或者再命令提示行工具,在项目 src/ 目录下创建一个叫做DisplayMessageActivity.java 的文件,在 原来的MainActivity.java 文件后面。
打开 DisplayMessageActivity.java 文件。如果你使用Eclipse创建这个activity:
这个类已经包含了一个必须的方法 onCreate() 的具体实现。你将稍后修改这个方法的实现。
还有一个方法onCreateOptionsMenu() 的实现,但是你不需要它,可以删掉它。
还有个方法onOptionsItemSelected()的实现,它为action bar 的 up 动作处理行为。保持它的样子。
这里还有个 PlaceholderFragment 类,它继承自Fragment.你在这个actiivity的最终版本中不需要这个类。
Fragment在一个可重用的模型里分解了应用程序的基础和界面(UI)。更多信息请阅读: Fragments API Guide 在这个activity的最终版本里不需要使用fragment。
注意: 如果你没有使用最后版本的ADT插件,你的activity可能看起来有点不同。确保你安装最后版本的ADT 插件 来完成这个练习。
DisplayMessageActivity 类 看起来像下面这样:
public class DisplayMessageActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_message);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment()).commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* A placeholder fragment containing a simple view.
*/
public static class PlaceholderFragment extends Fragment {
public PlaceholderFragment() { }
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_display_message,
container, false);
return rootView;
}
}
}
如果你使用了一个其他的不是Eclipse的IDE,使用上面的代码更新你的 DisplayMessageActivity 的代码。
所有的 Activity 的子类必须实现 onCreate() 方法。当创建一个新的activity的实例时系统将会调用它。这个方法是 你必须使用setContentView()方法定义activity布局的地方,也是 你处理初始化设置那些activity组件的地方。
注意: 如果你使用了一个其他的不是Eclipse的IDE,你的项目没有包含 在setContentView()中请求的 activity_display_message 布局。这是正常的,你将会在后面修改这个方法并且不使用这个布局。
添加标题字符串
如果你使用Eclipse,你可以跳过到下一章节,因为模板为新的activity提供了标题字符串。如果你使用了一个其他的不是Eclipse的IDE,在strings.xml中添加新activity的标题。
<resources>
...
<string name="title_activity_display_message">My Message</string>
</resources>
在清单(manifest)文件中添加
所有的activity都必须在清单文件中声明,AndroidManifest.xml,使用<activity>元素。
当你使用Eclipse工具创建一个activity,它创建了一个空的。如果你使用了不同的IDE,你需要自行添加清单文件的入口,像下面这样:
<application ... >
...
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>
</application>
android:parentActivityName 属性 声明了 在应用程序的逻辑层次中的activity的父activity。系统使用这个值去实现默认的导航行为,比如在安卓4.1(API等级16)或者更高的 Up navigation。你可以为安卓的旧版本提供相同的导航行为,使用 Support Library 和 展示的那样来添加<meta-data>元素。
注意: 你的安卓SDK可能已经包含了最近的安卓支持库(support library)。它被包含在ADT包中,但是如果你使用不同的IDE,你可以在 添加平台和包 Adding Platforms and Packages 时 安装它。当你使用Eclipse模板的时候,Support Library已经自动添加到你的应用项目里了(你可以在库的JAR文件 包里的Android Dependencies下面列出)。如果你不使用Eclipse,你需要手动的添加库到你的项目中,跟随 setting up the Support Library 指南的方式,这时再回到这里。
如果你使用Eclipse开发,现在你可以执行应用了,但是不会发生什么。点击 Send发送按钮开启第二个Activity,但是使用了被通过模板提供的一个默认的“hello world” 布局。你随后会更改这个activity来替换显示自定义的文本视图,这样如果你使用了其他的IDE,不要担心应用不能通过编译。
收到Intent
每个Activity都通过intent的形式被调用,不管用户通过扫描方式导航到那里。你能够通过调用 getIntent() 获得启动这个activity的Intent,和获得在它里面包含的数据。
在DisplayMessageActivity 类 的 onCreate() 方法里,获得intent和提取MainActivity传递而来的消息。
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
显示消息
为了在屏幕上显示消息, 创建一个 TextView 组件,并且使用 setText() 设置文本. 这时,添加代码使用 setContentView(). TextView 作为 activity的布局的 根视图 。
DisplayMessageActivity 的完整的 onCreate() 方法看起这样:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get the message from the intent
Intent intent = getIntent();
String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);
// Create the text view
TextView textView = new TextView(this);
textView.setTextSize(40);
textView.setText(message);
// Set the text view as the activity layout
setContentView(textView);
}
现在你可以启动应用程序了。当它打开时,在文本框输入一个消息,点击发送,这时消息出现在第二个activity。
图表2 。 在最终的应用程序里的两个activity,运行在安卓4.4
这就是了,你完成构建里你的第一个安卓应用!