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