標籤:
還是回到 Eclipse 中,首先展開 HelloWorld 項目,你會看到 1.17 所示的目錄結構。
圖 1.17
一開始看到這麼多陌生的東西,你一定會感到有點頭暈吧。別擔心,我現在就對中 的內容一一講解,你很快再看這張圖就不會感到那麼吃力了。
1. src
毫無疑問,src 目錄是放置我們所有 Java 代碼的地方,它在這裡的含義和普通 Java 項目下的 src 目錄是完全一樣的,展開之後你將看到我們剛才建立的 HelloWorldActivity檔案就在裡面。
2. gen
這個目錄裡的內容都是自動產生的,主要有一個 R.java 檔案,你在項目中添加的任 何資源都會在其中產生一個相應的資源 id。這個檔案永遠不要手動去修改它。
3. assets
這個目錄用得不多,主要可以存放一些隨程式打包的檔案,在你的程式運行時可以 動態讀取到這些檔案的內容。另外,如果你的程式中使用到了 WebView 載入本地網頁 的功能,所有網頁相關的檔案也都存放在這個目錄下。
4. bin
這個目錄你也不需要過多關注,它主要包含了一些在編譯時間自動產生的檔案。其中會有一個你當前項目編譯好的安裝包,展開 bin 目錄你會看到 HelloWorld.apk,把這個 檔案拷到手機上就可以直接安裝了。
5. libs
如果你的項目中使用到了第三方 Jar 包,就需要把這些 Jar 包都放在 libs 目錄下,放在這個目錄下的 Jar 包都會被自動添加到構建路徑裡去。你可以展開中 Android 4.0、
Android PrivateLibraries、Android Dependencies 這些庫,其中顯示的 Jar 包都是已經被
添加到構建路徑裡的。
6. res
這個目錄下的內容就有點多了,簡單點說,就是你在項目中使用到的所有圖片、布局、字串等資源都要存放在這個目錄下,前面提到的 R.java 中的內容也是根據這個目 錄下的檔案自動產生的。當然這個目錄下還有很多的子目錄,圖片放在 drawable 目錄下, 布局放在 layout 目錄下,字串放在 values 目錄下,所以你不用擔心會把整個 res 目錄 弄得亂糟糟的。
7. AndroidManifest.xml
這是你整個 Android 項目的設定檔,你在程式中定義的所有四大組件都需要在這個檔案裡註冊。另外還可以在這個檔案中給應用程式添加許可權聲明,也可以重新指定你 建立項目時指定的程式最低相容版本和目標版本。由於這個檔案以後會經常用到,我們 用到的時候再做詳細說明。
8. project.properties
這個檔案非常地簡單,就是通過一行代碼指定了編譯器時所使用的 SDK 版本。 我們的 HelloWorld 項目使用的是 API 14,你也可以在這裡改成其他版本試一試。這樣整個項目的目錄結構就都介紹完了,如果你還不能完全理解的話也很正常,畢竟裡
面有太多的東西你都還沒接觸過。不用擔心,這並不會影響到你後面的學習。相反,等你學 完整本書後再回來看這個目錄結構圖時,你會覺得特別地清晰和簡單。
接下來 我們一起 分析一下 HelloWorld 項目究 竟是怎麼 運行起來 的吧。首先 打 開
AndroidManifest.xml 檔案,從中可以找到如下代碼:
<activityandroid:name="com.test.helloworld.HelloWorldActivity"android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
這段代碼錶示對 HelloWorldActivity 這個活動進行註冊,沒有在 AndroidManifest.xml 裡 註冊的活動是不能使用的。其中 intent-filter 裡的兩行代碼非常重要,<action android:name="android.intent.action.MAIN" />和<categoryandroid:name="android.intent.category.LAUNCHER" /> 表示 HelloWorldActivity 是這個項目的主活動,在手機上點擊應用表徵圖,首先啟動的就是這 個活動。
那 HelloWorldActivity 具體又有什麼作用呢?我在介紹 Android 四大組件的時候說過,
活動是 Android 應用程式的門面,凡是在應用中你看得到的東西,都是放在活動中的。因此
你在圖 1.15 中看到的介面,其實就是 HelloWorldActivity 這個活動。那我們快去看一下它的 代碼吧,開啟 HelloWorldActivity,代碼如下所示:
public classHelloWorldActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_world_layout);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; thisadds items to the actionbar if it is present.getMenuInflater().inflate(R.menu.hello_world, menu);
return true;
}
}
首先我們可以看到,HelloWorldActivity 是繼承自 Activity 的。Activity 是 Android 系統提 供的一個活動基類,我們項目中所有的活動都必須要繼承它才能擁有活動的特性。然後可以 看到 HelloWorldActivity 中有兩個方法,onCreateOptionsMenu()這個方法是用於建立菜單的,我們可以先無視它,主要看下 onCreate()方法。onCreate()方法是一個活動被建立時必定要執 行的方法,其中只有兩行代碼,並且沒有 Hello world!的字樣。那麼圖 1.15 中顯示的 Hello world!是在哪裡定義的呢?
其實 Android 程式的設計講究邏輯和視圖分離,因此是不推薦在活動中直接編寫介面的,更加通用的一種做法是,在布局檔案中編寫介面,然後在活動中引入進來。你可以看到,在onCreate()方法的第二行調用了 setContentView()方法,就是這個方法給當前的活動引入了一 個 hello_world_layout 布局,那 Hello world!一定就是在這裡定義的了!我們快開啟這個檔案看一看。
布 局 文 件 都 是 定 義 在 res/layout 目 錄 下 的 , 當 你 展 開 layout 目 錄 , 你 會 看 到
hello_world_layout.xml 這個檔案。開啟之後代碼如下所示:
<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".HelloWorldActivity" >
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world" />
</RelativeLayout>
現在還看不懂?沒關係,後面我會對布局進行詳細講解的,你現在只需要看到上面代碼中有一個 TextView,這是 Android 系統提供的一個控制項,用於在布局中顯示文字的。然後你終於在TextView 中看到了 hello world 的字樣,哈哈終於找到了,原來就是通過 android:text= "@string/hello_world"這句代碼定義的!咦?感覺不對勁啊,好像圖1.15中顯示的是 Helloworld!,這驚嘆號怎麼沒了,大小寫也不太一樣。
其實你還是被欺騙了,真正的 Hello world!字串也不是在布局檔案中定義的。Android不 推 薦 在 程 序 中 對 字 符 串 進 行 硬 編 碼 , 更 好 的 做 法 一 般 是 把 字 符 串 定 義 在res/values/strings.xml 裡,然後可以在布局檔案或代碼中引用。那我們現在開啟 strings.xml 看 一下,裡面的內容如下:
<resources>
<string name="app_name">HelloWorld</string>
<stringname="action_settings">Settings</string>
<string name="hello_world">Helloworld!</string>
</resources>
這下沒有什麼再能逃出你的法眼了,Hello world!字串就是定義在這個檔案裡的。並且字串的定義都是使用索引值對的形式,Hello world!值對應了一個叫做 hello_world 的鍵,因此 在 hello_world_layout.xml 布局檔案中就是通過引用了 hello_world 這個鍵,才找到了相應的值。
這個時候我無意中瞄到了這個檔案中還有一個叫做 app_name 的鍵。你猜對了,我們還可以在這裡通過修改 app_name 對應的值,來改變此應用程式的名稱。那到底是哪裡引用了app_name 這個鍵呢?開啟 AndroidManifest.xml 檔案自己找找去吧!
1.3.4 詳解項目中的資源
如果你展開 res 目錄看一下,其實裡面的東西還是挺多的,很容易讓人看得眼花繚亂, 1.18 所示。
圖 1.18
看到這麼多的檔案夾不用害怕,其實歸納一下,res 目錄就變得非常簡單了。所有以 drawable 開頭的檔案夾都是用來放圖片的,所有以 values 開頭的檔案夾都是用來放字串的, layout 檔案夾是用來放布局檔案的,menu 檔案夾是用來放菜單檔案的。怎麼樣,是不是突然 感覺清晰了很多?之所以有這麼多 drawable 開頭的檔案夾,其實主要是為了讓程式能夠相容更多的裝置。在製作程式的時候最好能夠給同一張圖片提供幾個不同解析度的副本,分別放在這些檔案夾下,然後當程式啟動並執行時候會自動根據當前運行裝置解析度的高低選擇載入哪 個檔案夾下的圖片。當然這隻是理想情況,更多的時候美工只會提供給我們一份圖片,這時 你就把所有圖片都放在 drawable-hdpi 檔案夾下就好了。
知道了 res 目錄下每個檔案夾的含義,我們再來看一下如何去使用這些資源吧。比如剛剛在 strings.xml 中找到的 Hello world!字串,我們有兩種方式可以引用它:
1. 在代碼中通過 R.string.hello_world 可以獲得該字串的引用;
2. 在 XML 中通過@string/hello_world 可以獲得該字串的引用。基本的文法就是上面兩種方式,其中 string 部分是可以替換的,如果是引用的圖片資源
就可以替換成 drawable,如果是引用的布局檔案就可以替換成 layout,以此類推。這裡就不再給出具體的例子了,因為後面你會在項目中大量地使用到各種資源,到時候例子多得是呢。 另 外 跟 你 小 透 漏 一 下 , HelloWorld 項 目 的 圖 標 就 是 在 AndroidManifest.xml 中 通 過 android:icon="@drawable/ic_launcher"來指定的,ic_launcher 這張圖片就在 drawable 檔案夾下, 如果想要修改項目的表徵圖應該知道怎麼辦了吧?
Android 程式目錄介紹