Android程序員指南(16)



 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!應用程序。