編輯:開發入門
直觀來看,每個 Activity 通常會負責處理一個屏幕的內容 ( 包含界面、選單、彈出對話框、程序動作等 ) 。當我們需要從一個屏幕畫面切換到另一個屏幕畫面的時候,就涉及到了 Activity 切換的動作。 我們可以將 Activity 看成 MVC 模式中的 Control 。 Activity 負責管理 UI (詳細的 UI 細節可以由資源檔讀入),並接受事件觸發。
以是否需要與其他 Activity 交換資料來區分, Activity 可以粗分為兩種類型: " 獨立的 Activity" 與 " 相依的 Activity" 。不同類型的 Activity ,其動作也不盡相同:
獨立的 Activity
獨立的 Activity 是不需要從其他地方取得資料的 Activity 。只是單純的從一個屏幕跳到下個屏幕,不涉及資料的交換。 從一個獨立的 Activity 呼叫另一個獨立的 Activity 時,我們只要填好 Intent 的內容和動作,使用 startActivity 函式呼叫,即可喚起獨立的 Activity 。例如前幾章中,用作開啟特定網頁的 Activity 。
相依的 Activity
相依的 Activity 是需要與其他 Activity 交換資料的一種 Activity 。相依的 Activity 又可再分為單向與雙向。從一個屏幕跳到下個屏幕時,攜帶資料供下一個屏幕( Activity )使用,就是單向相依的 Activity; 要在兩個屏幕之間切換,屏幕上的資料會因另一個屏幕的操作而改變的,就是雙向相依的 Activity 。 與獨立的 Activity 比起來,相依的 Activity 變化更加精采。
我們會在後續章節中,對相依的 Activity 做進一步的說明。
獨立的 Activity
本章將繼續透過改進 BMI 應用程序來講解 android 應用程序設計。在這個過程中,我們將使用到獨立的 Activity 。
這章中所做的改動都是為了介紹獨立的 Activity ,而不是為了讓 BMI 程序變得更完整。因此你不妨先將寫好的 BMI 程序先壓縮備份到其他目錄中,再隨著後面的教學繼續探索 android 。
本章的目的是介紹獨立的 Activity ,會用到兩個屏幕,因此除了原本的一個 XML 描述檔與一個程序碼檔桉之外,我們還會額外再定義一個 XML 描述檔與一個程序碼檔桉,以支援第二個屏幕的動作。
要完成獨立的 Activity 的動作,我們要做幾件事:
1. 在程序碼中建立新 Activity 類別檔桉
2. 在清單中新增 Activity 描述
3. 在原 Activity 類別中加入 startActivity 函式
程序碼中建立新的 Activity 類別檔桉
首先,使用 Navigator 檔桉浏覽視窗,切換到 "src/com/demo/android/bmi" 資料夾。在 "bmi" 資料夾中,現存有 "Bmi.java" 與 "R.Java" 兩個檔桉。我們准備在此建立一個新的 Activity 類別檔桉。
在 "bmi" 資料夾圖示上按右鍵,選擇 "New->Class" 選項。 Eclipse 會跳出一個 "New Java Class" 對話框。
在對話框中的 "Name" 一欄上填入 "Report" 。 "Report" 的字頭需大寫,這是 Java 程序語言的默認規則。
在 "Superclass" 一欄右方,按下 "Browse..." , Eclipse 會跳出 "Superclass Selection" 對話框。在對話框中的 "Choose a type" 欄位中輸入 "activity" ,輸入框下方的 "Matching items" 欄位中,會顯示出所有可能的類別。我們選擇 "Activity - android.app - ..." 這個選項,點擊右下方的 "ok" 按鈕,回到上一個對話框。
此時, "Superclass" 欄位中將填入 "android.app.Activity" 訊息。按下對話框右下角的 "Finish" 鍵, Eclipse 會在 "bmi" 資料夾中,產生一個對應的 "Report.Java" 檔桉。
剛產生(尚未修改過的)的 "Report.Java" 檔桉如下:
代碼 :
1 package com.demo.android.bmi;
2
3 import android.app.Activity;
4
5 public class Report extends Activity {
6
7 }
在解讀程序流程一章中,我們已講解過 android 程序碼的基本架構,即 XML 描述檔與程序碼兩個主要組成部分。稍後我們要處理建立新程序碼的相關工作,包含定義對應的 XML 描述檔,與在程序碼中,填入這個 class 的內涵。
相關工作
在 "res/layout" 中新增一個 "report.xml" 檔桉,並把描述使用者界面 一章中講解過的 XML 檔桉復制一份過來:
代碼 :
1 <?XML version="1.0" encoding="utf-8"?>
2 <LinearLayout XMLns:android=http://schemas.android.com/apk/res/android
3 android:orIEntation="vertical"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <TextVIEw
8 android:layout_width="fill_parent"
9 android:layout_height="wrap_content"
10 android:text="Hello World, Bmi"
11 />
12 </LinearLayout>
打開 "src/com/demo/android/bmi/Report.Java" ,把解讀程序流程一章中講解過的預設的程序碼復制進來:
代碼 :
1 package com.demo.android.bmi;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5
6 public class Report extends Activity {
7 /** Called when the activity is first created. */
8 @Override
9 public void onCreate(Bundle savedInstanceState) {
10 super.onCreate(savedInstanceState);
11 setContentVIEw(R.layout.report);
12 }
13 }
上面的程序碼中,我們將
代碼 :
setContentVIEw(R.layout.main);
換成了:
代碼 :
setContentVIEw(R.layout.report);
以對應我們新定義的 XML 描述檔產生的資源識別符號。
清單中新增 Activity 描述
我們再打開 "AndroidManifest.xml" 檔桉,並切換到 "Application" 分頁。在 "Application" 分頁的左下角,我們可 以看到 "Application Nodes" 欄位中,列出目前已在 "AndroidManifest.xml" 檔桉中定義的所有 "Activity" 。現在我們就來將 "Report" 這個新的 Activity 加入到 "androidManifest.XML" 檔桉中。
點擊 "Application Nodes" 欄位右側的 "Add..." 按鈕,彈出一個小對話框。選擇 "Activity" 後,按下 "ok" 回到 "Application" 分 頁。 "Application Nodes" 欄位中會增加一個 "Activity" 項目。選擇這個 "Activity" 項目後,在 "Application Nodes" 欄位右方會出現新的 "Attributes for Activity" 相關欄位。
我們點選 "Name*" 欄位右側的 "Browse..." 按鈕,開啟另一個對話框。新的對話框中我們可以選擇在程序中現有定義的 Activity 。我們選擇 "Report - com.demo.android.bmi" 後,按 "ok" 鍵回到 "Application" 分頁。此時 "Name*" 欄位的內容變成了 "Report" , "Application Nodes" 欄位中的名稱也更新成 "Report(Activity)" 了。
activity 標簽的內容
我們從 "Application" 分頁切換到 "androidManifest.XML" 分頁,查看剛剛的動作實際上作了些什麽事。
我們發現,在原本的 activity 敘述下方,新增了一行名為 "Report" 的 activity 標簽,完整的 "androidManifest.XML" 清單內容如下:
代碼 :
1 <?XML version="1.0" encoding="utf-8"?>
2 <manifest XMLns:android=http://schemas.android.com/apk/res/android
3 package="com.demo.android.bmi">
4 <application android:icon="@drawable/icon">
5 <activity android:name=".bmi" android:label="@string/app_name">
6 <intent-filter>
7 <action android:name="android.intent.action.MAIN" />
8 <category android:name="android.intent.category.LAUNCHER" />
9 </intent-filter>
10 </activity>
11 <activity android:name="Report"></activity>
12 </application>
13 </manifest>
手動新增 activity 標簽
Android 提供了多種方式來協助我們定義 "AndroidManifest.xml" 清單檔桉,除了使用對話框選擇的方式之外,你也可以在原本的 "androidManifest.XML" 檔桉中直接修改源代碼,加入如下敘述:
代碼 :
<activity android:name="Report"></activity>
來得到相同的效果。
修改頁面標題文字
如果希望在打開 Report Activity 頁面時,標題欄上的文字將會是 "BMI 報告 " ,而不是預設跟 Activity 名稱相同的 "Report" ,我們可以在清單裡的 "report activity" 標簽中,加入標簽( label )屬性的描述。步驟如下。
1. 在 "res/values/" 目錄下,新建一個 report.XML 描述檔,存放 Report 活動頁面用到的字串。檔桉內容如下:
代碼 :
<?XML version="1.0" encoding="utf-8"?>
<resources>
<string name="report_title">BMI 報告 </string>
</resources>
2. 有了描述檔後,我們可以再修改 "androidManifest.XML" 清單,為 Report activity 添加標簽 (label) 屬性:
代碼 :
<activity android:name="Report" android:label="@string/report_title"></activity>
原 Activity 類別中加入 startActivity 函式
在准備好相關資源、並在 "androidManifest.XML" 清單添加新 activity 描述後,我們來到實際控制整個程序流程的程序碼部份。
在程序碼中,我們要把原本按下按鈕即開始計算,並顯示 Bmi 值到同一屏幕的按鈕動作,改成按下按鈕後跳轉到 "Report" 這個 Activity 。
首先修改 "BMI" 這個 Activity 。打開 "src/com/demo/android/bmi/Bmi.Java" 檔桉,修改 "OnClickListener" 函式 ( 定 義按下按鈕時做的動作 ) 的內容。按下按鈕後從 Bmi Activity 切換(跳轉)到 Report Activity 的程序片段如下:
代碼 :
1 private Button.OnClickListener calcBMI = new Button.OnClickListener()
2 {
3 public void onClick(VIEw v)
4 {
5 //Switch to report page
6 Intent intent = new Intent();
7 intent.setClass(Bmi.this, Report.class);
8 startActivity(intent);
9 }
10 };
修改好後,開啟 android 模擬器。當我們按下 " 計算 BMi 值 " 按鈕後,屏幕會切換到 "Hello World, Bmi" 頁面 ( 已經進入了 Report Activity) 。在這個頁面上,我們並沒有辦法可以直接回到前一個頁面,因為這兩個頁面都是獨立的 Activity 。但我們還是可以透過按下硬體的 "Undo" 鍵,使屏幕切換回原本輸入身高體重的頁面 ( 即回到 Bmi Activity) 。
講解
代碼 :
Intent intent = new Intent();
我們建立一個新的 " 意圖 "(Intent) 實體。
代碼 :
intent.setClass(Bmi.this, Report.class);
為這個意圖指定來源的 Activity 所在 class ,與要前往的 Activity 所在的 class 。
代碼 :
startActivity(intent);
將定義好的 intent 傳入 "startActivity" 函式中。 "startActivity" 函式會將 intent 傳入 Android 框架, android 框架會根據各應用程序在系統中注冊的資料 ( 有沒有聯想到我們剛剛為 Report Activity 增加的 activity 清單描述 ?) ,找出 Report 這個 Activity ,並呼叫它。
搞懂之後,原來呼叫一個獨立的 Activity ,所需的功夫其實很單純呀
和android UI layout一樣,我們也可以在XML中定義應用程序的菜單。通過在菜單的onCreateOptionsMenu方法中膨脹菜單layout
使用小部件的樣例應用程序現在我們要修改現有應用程序,使其像圖 8 中所示的那樣。本例的目的在於讓讀者熟悉在真實應用程序中對 textVIEw、editText
效果圖: Java代碼:import android.app.AlertDialog; import android.content.Context; import a
創建內容提供器和 Google Maps 應用程序您已經看到了一個完整的應用程序示例,現在簡要討論一下更加復雜的應用程序。內容提供器和 Google Maps本教程中討