我们希望支持卫星地图、交通地图和街道地图。此外,还将给出一些菜单按钮,支持缩放及另一种获取Jobs列表的方式。
Android提供了复杂的菜单集,包括3种菜单类型(选项、背景和子菜单),每个菜单都包含自己的功能、菜单按钮图标及其他高级功能。这里只使用基于文本的菜单按钮,需要做两件事:
1.创建将要显示的按钮的菜单。
2.捕捉菜单事件,调用相应的动作。
下面这段在MicroJobs.java文件中的代码的功能就是创建菜单:
/** * Set up menus for this page * * @see android.app.Activity#onCreateOptionsMenu(android.view.Menu) */@Overridepublic 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) */@Overridepublic 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中包含的代码类似。