第五章 应用:Hello World!——上
关键技能和概念
l 创建新的Android工程。
l 使用视图
l 使用文本视图
l 更改main.xml文件
l 在Android模拟器上运行应用
本章中,你会创建第一个Android活动。本章从头到尾研究了应用构建过程。我会给你介绍如何在Eclipse中创建一个Android工程,如何往初始化文件中添加代码,如何在Android模拟器中运行最终的应用。最终应用是运行在Android环境上的全功能的程序。
实际上,当你过完本章,你会创建不止一个Android活动。计算机编程传统证明你的第一个应用一定是Hello World!类型的应用,所以在第一节中你会创建一个标准的Hello World!应用,仅仅是一个空白的背景和“Hello World!”文本。然而,为了使你更好的了解这门语言起见,下一节将详细解释Android是如何自动创建Hello World!应用的。你将创建该活动的两项迭代,每种都是用不同的技术向屏幕输出信息。你也将创建两种不同版本的Hello World!应用,通过图片来展示Hello World!信息。现在就给你介绍Android的控制和内部工作原理。
为了确保你仔细的浏览了Android的编程方式,在第六章,还会分别在Microsoft Windows与Linux平台上通过Android SDK的命令行,为你创建这两种应用。换句话说,本章涵盖在Eclipse中的创建步骤,第六章涵盖在命令行中的创建步骤。因此,在继续之前,你应该检测一下你的Eclipse环境是否正确配置。温习第三章中为Android SDK设置PATH声明的步骤。你应该确保你的JRE确实在PATH声明中。
用Eclipse创建首个Android项目
启动Eclipse,创建第一个Android项目。当你首次打开Eclipse时,会打开一个默认的开发环境(参照图5-1),也就是你的起步点。你的第一个任务就是为你的应用安装和命名workspace。选择File|New|Android Project,启动New Android Project向导。
图5-1默认Eclipse开发环境
New Android Project向导为你创建两项:
l 一个利用android.jar文件与Android SDK绑定的shell应用,将项目绑定到Android模拟器上。这可以使你编码时利用全部Android库和包,也可以让你在稳定的环境中调试你的应用。
l 新项目的shell文件。这些shell文件包含一些虚拟的应用,这取决于你在程序中构建什么。这与在Visual Studio中创建Microsoft .NET应用的方式大抵相同,生成一些windows平台创建的程序代码,利用Eclipse中的Android 项目向导生成你的初始化程序文件和创建Android的代码。
一般来说,新建Android项目向导包含一些选项,下一步提示,你必须设定以初始化你的Android项目。
在Project Name表单域,本例中用HelloWorldText做标题。该名字以便跟HelloWorld!项目中创建的其它名称明显区分开。
在内容域,默认选择:选中Create New Project in Workspace单选按钮和User Default Location多选按钮。这会使Eclipse在默认的workspace目录中创建项目。保持默认选项的好处是,可以使你的项目保存到中心位置,以方便定制,管理和寻找这些项目。例如,如果你在基于Unix的环境中开发,该路径指向你的$HOME目录。如果你在Microsoft Windows的环境中开发,workspace路径会是c:/Users/<username>/workspace,如前面所示。
然而,处于某种原因,你可能不会选中User Default Location多选框,并为你的项目选择不同的位置,你可能会定制不同位置的原因仅仅是,你想为个别项目选择一个位置,以便与其它Android项目区分开。例如,你可能会将你在本书中创建的项目与以后你自己创建的项目保存到不同的位置。如果这样,只要跳Location选项,为你的项目定制个性化的位置目录即可。
另一方面,当安装Eclipse(如第二章的最后一节所述)时,在Select a Default Workspace对话框中,如果你不选中Use This as the Default和Do Not Ask Again多选框,你可能需要定制一个项目位置。在Eclipse安装时选中该框,会将所有新项目默认到该workspace目录(默认位置在Location field of the New Android Project向导中会找到)。在Eclectic安装过程中,你没有选中选择框,你需要跳过点击浏览按钮找到目录,为你的新项目选择一个路径。
New Android Project向导中的最后三项再属性域。这些属性定义了项目如何集成到Android环境的方式。在Package Name表单域,你可以为你的应用包自定义命名空间。例如,android.app.Activity或com.google.android.map.MapActivity。
对于HelloWorldText应用,使用的包名是android_programmers_guide.HelloWorldText。 为你的引用代码标识独一无二的名字可以将本书中你开发的测试应用和其它应用区别开。
在下一个的属性域,Activity Name,是必填项,因为它是你应用的主屏的参照。也就是说,将Activity当做是程序显示的“窗口”。没有Activity,你的应用就无可奈何。然而,因为Android应用可以由几个Activity组成,新建Android工程想到需要知道哪个是默认的Activity。Activity Name也是一个必填域,并且没有默认值,所以你必须填一个才能继续。由于是做例子,所以使用了HelloWorldText。这样可以在必要的时候,使作为描述性的应用简单一些。
最后的属性域,Application Name,定义引用的名字。这个名字用来管理你的应用,当它安装到设备上时。为了简单起见,我们再次用HelloWorldText作为应用名。下面的图例展示了完整的New Android Project向导。
点击Finish结束创建过程。向导即启动后台进程,配置自动生成的必要文件,安装支持Android应用项目的目录结构。当进度完成时,你就拥有了你的第一个Android 应用项目,如图5-2所示。
图5-2 你的首个Android应用项目
下面的章节研究自动生成的Android文件内容和一些shell文件在应用中的功用。
研究Android生成文件
本章研究Android为你生成的新文件,如果你不知道你要看什么,你可能会在你不应该放代码的地方写代码。有些Android生成的文件需要修改,但有些你不需要修改,了解这些差别,可能会让你避免重建项目。
打开新的应用项目,看看Package Explorer,即开发主面板的左侧标签。下面展示Package Explorer的样子。
在HelloWorldText例子中,你会看到一个根目录。根目录是你所有项目文件的家或者库。用户创建的文件和Android自动生成的文件都放在这个目录下,从Package Explorer很容就就可以访问到。目前,你的根目录中会有几项:一个AndroidManifest.xml文件,一个包含引用库的包,以及三个目录(res,assets和src)。下面研究这三项:
AndroidManifest.xml
AndroidManifest.xml文件你是做全局设置的地方。如果你是一个ASP.NET开发人员,你可以把AndroidManifest.xml文件当成Web.config和Global.asax的合成体。(如果你不是ASP.NET开发人员,对你来说AndroidManifest.xml文件就是一个存储配置的地方。)AndroidManifest.xml文件包括一些配置,如应用权限,活动和集中过滤器。
标准的AndroidManifest.xml文件包括以下的信息:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android=http://schemas.android.com/apk/res/android package="testPackage.HelloWorldText">
<application android:icon="@drawable/icon">
<activity class=".HelloWorldText" android:label="@string/app_name">
<intent-filter>
<action android:value="android.intent.action.MAIN" />
<category android:value="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
如果你将来创建应用,你会在这个文件中添加信息。注意列表中提供的包名和Activity处理的活动。
引用库
项目根目录中也包含了一个应用库列表。对于新项目,通常情况下,你会在这里看到一个库。展开引用库的分支,仔细查看它的内容和你在项目中引用的库。鉴于它是一个新的Android项目,你会在你的项目引用中看到一个库,android.jar,即Android SDK。(如果你熟悉JAVA SDK,android.jaba类似于Java的rt.java文件,在rt.java中包含了很多Java API。)Android插件能保证你的应用拥有唯一的引用库文件。应用需要引用SDK来访问SDK库中包含的所有类,如视图,控制和GoogleAPI。
目录
项目根路径中也有三个根目录——res、assets和src——每个都有鲜明的功用。这些目录成了你的应用程序操作的组成部分。
res目录
res目录用来保存和编译你的项目资源的地方。当你创建了一个新的Android项目,res目录包含了三个子目录:drawable、layout和values。你会在项目中使用drawable和layout目录分别保存和展示图片和层,而values目录则保存字符串的项目中使用的全局变量。Drawable目录包含你的项目会使用和引用的实际图片文件。Layout目录拥有一个XML文件,main.xml,当构建接口时你的应用可以引用。本书的大部分应用,你都会编辑layout目录下的main.xml文件。它允许你向应用的可见层插入视图,并进行展示。原始的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">
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Hello World, HelloWorldText"/>
</LinearLayout>
Res下面的最后一个目录values,拥有一个名为strings的XML文件。这个string.xml文件用来保存应用所引用的全局字符串变量。
assets目录
assets目录用来保存原始的资源文件。在assets目录的文件可能包含流媒体和动画资源的音频文件。本书的应用中我没有用到任何音频资源,因为Android模拟器的音频驱动测试版还没有优化。
src目录
src目录包含你的所有项目源文件。当你的项目刚创建时,它会包含两个文件,R.java和<activity>.java(本例中是HelloWorldText.java),如下描述:
R.java文件 R.java是由Android插件为你的应用自动生成的文件。文件包含了指向drawable、layout和values目录的指针(或者目录中的文件,如字符串和图标)。你不需要直接更改这个文件。在大部分应用中都会引用R.java。HelloWorldText应用自动生成的代码如下:
/* 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 testPackage.HelloWorldText;
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;
}
}
<activity>.java文件 src目录中你会花大量时间接触的文件是<activity>.java,它也是由Android插件创建的,并且和在新建Android项目向导中命名的Activity名字一致。不像本书中其它你所研究的文件,该文件是完全可以编辑的,实际上,如果你不更改它的代码,基本上是没有用的。
在简单的浏览HelloWorldText.java文件中的Android插件创建的内容之后,你就可以编辑该文件,创建你的第一个Android Activity。
package android_programmers_guide.HelloWorldText;
import android.app.Activity;
import android.os.Bundle;
public class HelloWorldText extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
}
}
文件的前三行代码是标准的预处理指令——也就是,如大部分编程语言一样,在程序运行之前给编译器的发送指令的声明。本例中,你已经定义和包含了你的android_programmers_guide.HelloWorldText包。
下面两行是通过android.jar从Android SDK引入的特定的包:
import android.app.Activity;
和
import android.os.Bundle;
这些行在应用的所有代码之前,告诉项目去包含引入包的所有代码。这两行对你的基础 Android应用来说非常重要,不能被移除。
现在把注意力集中到你的HelloWorldText类上,你可以看到它扩展了Activities类。Activity在前面的代码中被引入。所有应用都继承Activity类,这种依赖对于运营在Android上的应用非常必要。屏幕上运行和战士的内容,都是从Activity派生出来的。
HelloWorldText类拥有需要创建,展示与运行应用的代码。现在你的HelloWorldText类中只定义了一个方法,onCreate()。
onCreate()方法捆绑了icicle。也就是说,当前所有状态信息都绑定成一个icicle对象存储到内存中。在应用中你不会处理icicle,但是你需要它的存在和功用。
文件中的下一行才真正的做了一些动作:
setContentView(R.layout.main);
setContentView()方法将Activity的内容设定到指定的资源上。本例中,我们通过R.java文件中的指针,使用layout目录下的main.xml文件。Main.xml文件,现在仅仅包含了HelloworldText屏幕的大小和一个TextView。TextView是由View派生的,用来在Android环境中展示文本。浏览main.xml中的内容,你会看到它包含下面一行。
android:text="Hello World, HelloWorldText"
考虑到setContentView()方法把main.xml看做当前的View,并且main.xml中包含了一个TextView输出“Hello World, HelloWorldText!”,可以假定,编译和运行HelloWorldText可以为你实现Hello World应用。为了证明这一点,运行你的原始HelloWorldText应用。选择Run|打开 Run As 对话框,选择Android Application,然后点击OK。
你刚创建的项目包括了自动创建HelloWorld!应用的代码。然而,这并没多大作用,至少没有过多地教你编写Android应用。你需要剖析项目,仔细研究项目是如何展示“Hello World!”信息的。
当你创建新的Android项目时,Android插件更改了main.xml文件。这是个用来修改Android UI方式的非常完美的例子。当项目创建时,下面的代码加进了 main.xml中。
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, HelloWorldText"
/>
虽然我已经提过过xml中存在TextView,但我还没说明没有任何相关代码它如何会工作的原因。在本书前面中我提过有两种设计Android UI的方式:通过代码和通过main.xml文件。前面的代码示例在xml中创建了一个TextView,并将文本设置为“Hello World, HelloWorldText”。如下编辑main.xml中的这一行:
android:text="This is the text of an Android TextView!"
返回项目,你的更改结果会如图所示。
花些时间,试验xml的TextView,然后你就会发现有另一种创建HelloWorld!应用的方式。
(未完待续。。。。。)
更多相关文章
- android:manageSpaceActivity让应用手动管理应用的数据目录
- Android sdk manager无法启动之swt.jar文件没有指定
- 关于AVD启动失败的问题--找不到文件篇
- Jetpack插件化学习之AndroidX--Android项目升级到AndroidX
- android读写assets目录下面的资源文件(文件夹)
- Android下修改hosts文件