今天的內容較為簡單,建議非初學者直接略過。
昨天已經將「新增寶寶」的使用者界面 (XML) 設計好,今天要來討論程式 (Java) 的部分了,有兩個重點:(1) 如何建立一個新的 Activity 和 (2) 如何啟動新的 Activity。
首先討論如何建立一個新的 Activity,這系列的文章剛開始時,筆者就有說過,初學者可以把 Activity 想成是是一個畫面,之前討論過的 CalendarActivity (對應的使用者界面檔是 activity_calendar.xml)是一個顯示月曆的畫面 (Activity),而「新增寶寶」又是另一個畫面 (Activity),昨天已經討論過這個畫面的使用者介面(XML檔),今天要建立一個新的 Activity 類別,並說明如何啟動這個新的 Activity。
首先筆者反白 lincyu.babylog,按右鍵選擇 New -> Package,然後輸入 babymanager,也就是筆者打算把新的 Activity 建立在 lincyu.babylog.babymanager 下,建立新的 Activity 的「標準」做法如下:反白 babymanager,按右鍵選擇 New -> Activity -> Blank Activity,然後輸入適當的 Activity Name, Layout Name 和 Title 就可以了,建立好新的 Activity 後,專案會產生三個新改變:
其中 AndroidManifest.xml 個改變需要特別說明一下,讀者是否還記得,筆者在介紹 Implicit Intent 時,曾經說過 Intent 送到系統後,系統會去檢查它的 Activity List 裏有哪些 Activity 可以幫忙處理這個 Implicit Intent,而系統是如何維護這個 Activity List 呢?答案就是當我們新增一個 Activity 時,應該於 AndroidManifest.xml 幫這個 Activity 利用 activity 標籤做註冊。
筆者有時會用「非標準」的做法新增 Activity,例如新增一個空類別,然後自己撰寫程式碼,讓這個新類別繼承 Activity,或者複製既有的 Activity 類別,然後貼上時更換類別名稱,如此就新增了一個新的 Activity,採用這種「非標準」做法來新增 Activity 時,別忘了我們要自己「手動」在 AndroidManifest.xml 利用 activity 標籤幫新的 Activity 做註冊。
現在我們已經新增了一個 Activity,那麼如何啟動它呢?由於這個新的 Activity (筆者將之命名為 AddBabyActivity)是從 CalendarActivity 的選單中啟動的,而 CalendarActivity 和 AddBabyActivity 是屬於同一個 App,因此不需要使用 Implicit Intent,只要使用 Explicit Intent 就可以了,關於 Implicit Intent 我們先前已經介紹過了,就是要設定一個 ACTION (字串),而 Explicit Intent 更簡單,只要設定要啟動的 Activity 的 Class 就可以了,方法是呼叫 Intent 類別的 setClass 方法,setClass需要兩個參數,第一個參數是啟動者的物件實體, 也就是 CalendarActivity 的物件實體,第二個則是被啟動者類別的 Class 物件,啟動 AddBabyActivity 的詳細程式碼如下所示:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_addbaby:
Intent intent = new Intent();
intent.setClass(this, AddBabyActivity.class);
startActivity(intent);
return true;
case R.id.action_babylist:
return true;
case R.id.action_mailtodeveloper:
mailToDeveloper();
return true;
}
return super.onOptionsItemSelected(item);
}
明天就要開始討論 AddBabyActivity 的實作。