5. 2 查看Android创建的文件
(因为一些杂七杂八的事情,翻译中断了半年,现在,让我们继续)
这一节探讨Android刚刚为您创建的新文件。一个相当可靠的文件结构已经为您建好,如果您不知道您看到的东西是什么,那么请先别在这些文件里放入任何代码。Android创建的这些文件中,有一些是需要您修改的,而另一些则是不能修改的。知道它们的不同,可以避免使您重新再创建一次工程。
打开您的新工程,看一下Package Explorer(软件包浏览器),这是代码区左侧窗格的两个标签栏其中的一个,如下图。
注意:如果Package Explorer没有开启,您可以通过在菜单中选择Window | Show View | Package Explorer来打开。
您应该看到一个根目录,名为HelloWorldText。根目录可以说是一个家或是仓库,容纳了所有的项目文件。无论是您自己创建的文件还是Android自动生成的文件都将被放置在这个目录中,通过Package Explorer方便的存取。目前在您的根目录里,应有少数的几个文件:一个名为AndroidManifest.xml 的文件,一个package包含了Referenced Libraries(引用库)和三个目录(res, assets, and src)。接下来我们探讨一下它们。.
5.2.1 AndroidManifest.xml
AndroidManifest.xml记载了项目的全局设置。如果您是一个ASP.NET开发人员,那么您可以将AndroidManifest.xml想象成Web.config和Global.asax集于一身的角色。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>
在创建未来的应用,您将信息添加到该文件。注意这个Package要列在这里,以及您的Activity要处理的Action。
5.2.2 Referenced Libraries 引用库
引用的库的清单也包括在项目的根目录里。一般,作为初学者的项目,您应该看到只有一个库在这里。展开引用库的分支,看一下其中的内容,这就是目前您的应用程序用到的库。由于这是个新的Android项目,您将看到一个库,android.jar,即Android SDK。(如果您熟悉的Java SDK,android.java类似于Java的rt.java文件,其中包含的许多Java API可以在rt.java中找到。)Android插件确保这个文件是唯一被您的应用程序引用的库。应用程序需要引用SDK来获取SDK库包含的所有的类,如视图、控件、以及Google API。
注意:Eclipse允许您将其他的用户定义库和外部类加入到您的项目引用中。不过,您应三思而后行再增加这些外部引用,除非您确信您的Android程序将使用到它们。
5.2.3 目录
项目根目录总也包括这三个目录--res、assets和src--每一个都有明确的目的。这些目录是您的应用程序得以运行的不可缺少的一部分。
res目录
res目录中是项目的资源,它们存放在这里并被编译到应用程序中。当您创建一个新的Android项目,res目录包含三个子目录:drawable、layout和values。您可以在许多项目中分别使用drawable和layout来存放图形和布局。而values目录则存放字符串。
注意:对res目录及其内容的引用被包含在scr目录下的R.java文件中。后续将详细讨论这个文件。
drawable目录包含了程序可以使用和引用的图像文件。layout目录包含一个XML文件main.xml,当产生用户界面时,会被您的应用程序引用。在这本书中的大多数应用程序,你都可以编辑main.xml文件。在第五章“Hello, world!"程序中,您可以插入一个视图到您的可视化布局中,并且显示它们。一个未修改过的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>
最后一个目录,values包含了一个名为strings.xml的XML文件,strings.xml文件用来存放可被应用程序全局应用的字符串。
assets目录
assets目录用来存放原始的资产文件。其中的文件可以是用于流媒体或动画的音频文件。本书的应用程序中我没有使用任何的音频文件因为Android模拟器中所用的Beta版本的音频驱动程序尚未优化过。
src目录
src目录包括您的项目中所有的源文件。当您的项目第一次创建时,它包含两个文件R.java和<activity>.java (在这个例子中是HelloWorldText.java)。
注:<activity>.java一般都是用Activity名字来命名。
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;
}
}
注:R.java文件的注释部分提供了文件的来源的解释。它指出,该文件是由aapt工具创建的。在第六章中,当您创建一个基于的Hello World!程序时,您将使用命令行工具创建的所有这些自动生成的文件。
<activity>.java 文件是需要耗费您的大部分精力。与这一节中的我们已经研究过的大多数文件文件,这个文件是可编辑的。实际上,如果不修改代码的话,它为您做的事是相当的少。我们简单的看一下HelloWorldText.java文件,此后您将编辑文件并创建您的第一个Android Activity。
package android_programmers_guide.HelloWorldText;
import android.app.Activity;
import android.os.Bundle;
Chapter 5: Application: Hello World! 65
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);
}
}
文件的顶部三行是标准的预处理器指令,预处理器用来指导编译器如何运行。本例中,定义并包含了您的package "android_programmers_guide.HelloWorldText"。接下来的两行导入了android.jar中Android SDK的指定packages。
这些行告诉项目从导入的Package中包括所有的代码,他们是你的Android应用程序的关键,不能被删除。
提示:如果您在项目中没有看到android.os.Bundle import语句,请展开开发窗口的树形目录。Eclipse卷起了所有的import语句,而只显示第一个,所以您需要展开它才能看到余下的部分。
现在请关注您的Class HelloWorldText,可以看到,它扩展了Activity class。Activity class是此前的几行中导入的。所有的应用程序都是由Activity class派生出来的,这些派生类只有在Andoid平台上才能运行。对于那些需要运行并在屏幕上显示的应用程序,必须Activity 派出。
HelloWorldText class包含了用来建立、显示和并运行您的应用程序的代码。不过现在,在您的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设置为当前的视图,并且main.xml包含一个TextView,上面写着“Hello World, HelloWorldText”,那么现在我们可以编译和运行HelloWorldText。要进行这样的尝试,运行您的未修改过的HelloWorldText程序,请选择Run|Run,打开Run As对话框,选择Android应用程序,然后点击OK。
刚刚建立的新的项目包含创建一个Hello World!应用程序的代码。然而,这不是很够,也不能教您有关Android编程的那许多东西。您需要剖析这个项目,并仔细看清楚这个项目是如何显示的“Hello World!”的。
当您创建新的Android项目时,Android插件对main.xml进行了修改。这是一个修改Android用户界面的完美的例子。当项目创建时,下面的代码行被Android SDK添加到main.xml中。
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, HelloWorldText"
/>
我们在讨论xml中存在TextView时,没有探讨它不需要任何代码就可以正常工作。在本书前面,我提过有两种设计Android用户界面的方法:通过代码和通过main.xml文件。而这一例子就是xml中创建了一个TextView,并且将文本为“Hello World, HelloWorldText.”。编辑main.xml中的这一行使它看起来像这样:
android:text="This is the text of an Android TextView!"
重新运行项目,结果应该与下图中显示的一样。花一些时间对xml TextView做实验,这样您可以从转而是用到另一方式创建Hello World!应用程序。