【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”
在進一步學習 Intent 與 Activity 之前,我們先來完善我們的應用程式。 在前幾章中,我們把 「openOptionsDialog」 這個用來彈出對話框的函式,放進「calcBMI」這個按鈕元件的「OnClickListener」方法中。現在,我們要把「openOptionsDialog」 移出「OnClickListener」方法,改成按下「Menu」鍵後,跳出一個選單列(Menu Bar)。當我們點擊選單列中的選項後,才彈出 「openOptionsDialog」 的對話框。
完整的程式碼如下:
1 protected static final int MENU_ABOUT = Menu.FIRST;
2 protected static final int MENU_Quit = Menu.FIRST+1;
3
4 @Override
5 public boolean onCreateOptionsMenu(Menu menu) {
6 super.onCreateOptionsMenu(menu);
7 menu.add(0, MENU_ABOUT, 0, "關於...");
8 menu.add(0, MENU_Quit, 0, "結束");
9 return true;
10 }
11
12 public boolean onOptionsItemSelected(MenuItem item)
13 {
14 super.onOptionsItemSelected(item);
15 switch(item.getItemId()){
16 case MENU_ABOUT:
17 openOptionsDialog();
18 break;
19 case MENU_Quit:
20 finish();
21 break;
22 }
23 return true;
24 }
每個選單都包含兩個部分:
- 建立選單
- 處理選項動作
「onCreateOptionsMenu」函式即選單列的主體。在 Android 機器或模擬器上按下硬體的「Menu」(選單)鍵,所彈出的選單列即是靠「onCreateOptionsMenu」函式來定義。當我們在 Activity 中定義了 「onCreateOptionsMenu」 之後,按下「Menu」(選單)鍵時,就會彈出相對應的選單列。
當我們在 Android 應用程式的選單列上選擇了相應的選項後,則是依賴「onOptionsItemSelected」函式,來負責處理選單列中各選項所個別對應的動作。
在上面的程式裡,我們定義了「關於...」與「結束」兩個選單列中的選項。我們分部分講解如下:
建立選單處理選項動作
在 「onCreateOptionsMenu」函式中,我們定義了兩個選單列中的選項。 分行講解如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
return true;
}
「onCreateOptionsMenu」這個函式是選單列的主體,它是一個「public」(公開)的函式。函式傳入一個「Menu」(選單)型別的「menu」參數。「boolean」則表示函式的返回值必須為「boolean」型別的值。因此在函式最後,我們提供函式一個返回值「true」。「@Override」表示我們要完全重寫掉已定義在「Activity」類別中的這個函式。
基於與 onCreate 函式一樣的原因,因為我們把選單列原本的動作覆載 (Override) 掉了,因此在撰寫我們自己的內容前,加上一句「super.onCreateOptionsMenu(menu)」敘述,用來呼叫「onCreateOptionsMenu」函式執行預設的動作。
menu.add(0, MENU_ABOUT, 0, "關於...");
menu.add(0, MENU_Quit, 0, "結束");
Android 每個頁面對應到一個 Activity,每個 Activity 都有一個獨立的選單列。對傳入的「menu」參數作處理就能改變選單列的內容。
我們看到,增加一個選單列中選項的格式如下:
menu.add(0, 識別符號(identifer), 0, 字串或資源識別符號);
最後一欄「字串或資源識別符號」就是顯示在螢幕上的敘述。 而「識別符號」的目的則是作為這個選項的標籤,以供後續處理選項動作時,更容易辨認出所對應的選項。
protected static final int MENU_ABOUT = Menu.FIRST;
protected static final int MENU_Quit = Menu.FIRST+1;
我們看到 MENU_ABOUT 識別符號的定義,是一個固定的常數型別(static final int)。「Menu.FIRST」則代表識別選單開頭的數字,當然我們也可以把這「Menu.FIRST」代號直接用任意數字替換,看看程式會發生什麼事。
在「OptionsItemSelected」函式中,我們分行講解如下:
public boolean onOptionsItemSelected(MenuItem item)
{
super.onOptionsItemSelected(item);
return true;
}
「onOptionsItemSelected」這個函式是處理所有選項的主體,和「onCreateOptionsMenu」函式相同,也是一個「public」(公開)的函式。「onOptionsItemSelected」函式傳入了一個「MenuItem」(選項)型別的「item」參數。「boolean」表示函式的返回值必須為「boolean」型別的值。因此在函式最後,我們提供函式一個返回值「true」。 「super.onOptionsItemSelected(item);」表示我們要先執行已定義在「Activity」類別中原本的「onOptionsItemSelected」函式內容,後面再接著執行我們為此函式新定義的動作。
switch(item.getItemId()){
我們可以用「item.getItemId()」函式來取得在螢幕上選取的選項所對應的識別符號代碼(identifer)。
switch(識別符號代碼){
....
}
在 swith 敘述中,我們根據從「item.getItemId()」函式取得的識別符號代碼判斷, 根據選到的識別符號代碼,作相應處理。
case MENU_ABOUT:
openOptionsDialog();
break;
case
....
break;
在「onOptionsItemSelected」函式中收到 「MENU_ABOUT」 識別符號時,我們呼叫 「openOptionsDialog」 函式來彈出對話框。
case MENU_Quit:
finish();
break;
在「onOptionsItemSelected」函式中收到 「MENU_Quit」 識別符號時,我們呼叫 Android 內建的 「finish」函式來關閉這個 Activity。因為我們的「BMI」應用程式只由一個「Bmi」Activity 組成,所以當我們呼叫「finish」函式來關閉「Bmi」這個 Activity,就等於直接關閉了這個「BMI」應用程式。
而事實上, 在 Android 平台上,無論是開發者或是使用者,都不需要自己來關閉 Activity。 因為 Android 虛擬機(Dalvik) 接手了什麼時候 Activity 該啟動或關閉的工作。整個 Android Activity 的運作流程,將在後續章節中作講解。