• 沒有找到結果。

加入菜单(Menu) (Menu) (Menu) (Menu)

在文檔中 深入浅出 (頁 57-60)

加入菜单(Menu) (Menu) (Menu) (Menu)

在进一步学习 Intent 与 Activity 之前,我们先来完善我们的应用程序。 在前几章中,

我们把 "openOptionsDialog"这个用来弹出对话框的函数,放进"calcBMI"这个按钮元件的

"OnClickListener"方法中。现 在,我们要把"openOptionsDia log" 移出"OnClickListener"方法 , 改成按下"Menu"键后,跳出一个菜单列(Menu Bar)。当我们点击菜单列中的选项后,才弹出

"openOptionsDia log" 的对话框。

完整的程序码如下:

代码::::

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 openOptionsDia log();

18 break;

19 case MENU_Quit:

20 finish();

21 break;

22 }

23 return true;

24 }

每个菜单都包含两个部分:

1. 建立菜单 2. 处理选项动作

"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:

openOptionsDia log();

break;

case ....

break;

在"onOptionsItemSelected"函数中收到 "MENU_ABOUT" 识别符号时,我们呼叫

"openOptionsDia log" 函数来弹出对话框。

代码::::

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 的运作流程,将在后续章节中作讲解。

在文檔中 深入浅出 (頁 57-60)