我们希望支持卫星地图、交通地图和街道地图。此外,还将给出一些菜单按钮,支持缩放及另一种获取Jobs列表的方式。
Android提供了复杂的菜单集,包括3种菜单类型(选项、背景和子菜单),每个菜单都包含自己的功能、菜单按钮图标及其他高级功能。这里只使用基于文本的菜单按钮,需要做两件事:
1.创建将要显示的按钮的菜单。
2.捕捉菜单事件,调用相应的动作。
下面这段在MicroJobs.java文件中的代码的功能就是创建菜单:
/**
* Set up menus for this page
*
* @see android.app.Activity#onCreateOptionsMenu(android.view.Menu)
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
boolean supRetVal = super.onCreateOptionsMenu(menu);
menu.add(Menu.NONE, 0, Menu.NONE, getString(R.string.map_menu_zoom_in));
menu.add(Menu.NONE, 1, Menu.NONE, getString(R.string.map_menu_zoom_out));
menu.add(Menu.NONE, 2, Menu.NONE, getString(R.string.map_menu_set_satellite));
menu.add(Menu.NONE, 3, Menu.NONE, getString(R.string.map_menu_set_map));
menu.add(Menu.NONE, 4, Menu.NONE, getString(R.string.map_menu_set_traffic));
menu.add(Menu.NONE, 5, Menu.NONE, getString(R.string.map_menu_show_list));
return supRetVal;
}
通过覆盖onCreateOptionsMenu方法创建菜单按钮,这里为Activity菜单传递菜单参数。除了支持超类执行其需要的操作,这里只是使用menu.add方法添加菜单项(按钮)。这里选定的menu.add方法包含4个参数:
int groupid
Android支持对菜单项进行分组,这样可以一次快速修改整个菜单。在MicroJobs中不需要这个功能,因此将这个参数的取值设置为Menu.NONE。
int itemid
需要为该菜单项提供唯一标识符,这样在后期可以知道是否选中了这个菜单项。
int order
第二个参数itemid并没有给出参数的顺序。如果关心菜单项的显示顺序,则可以使用这个参数来指定顺序。因为在这个例子中我们不关心顺序,所以这个参数值也是设置为Menu.NONE。
int titleRes
该参数为按钮标题字符串资源提供ID。注意,这个参数的类型是Integer,而不是String,因此菜单字符串需要在string.xml文件中预先定义,该文件在res目录下。注意,Android会负责把res/strings.xml文件编译成.java文件(R.java),它会给每个字符串分配一个整数值。getString方法会返回一个整数值(该方法名称较容易让人误解,它是返回一个整数,而不是字符串)。
为了捕捉菜单事件,重写了onOptionsItemSelected方法,如下所示:
/**
* @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId) {
case 0:
// Zoom in
zoomIn;
return true;
case 1:
// Zoom out
zoomOut;
return true;
case 2:
// Toggle satellite views
mvMap.setSatellite(!mvMap.isSatellite);
return true;
case 3:
// Launch streeView (streetView);
return true;
case 4:
// Toggle traffic views
mvMap.setTraffic(!mvMap.isTraffic);
return true;
case 5:
// Show the job list activity
startActivity(new Intent(MicroJobs.this, MicroJobsList.class));
return true;
}
return false;
}
使用的是MenuItem参数,switch中的各个case与菜单中定义的各个按钮对应,每个case中包含的代码类似。