首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》通过菜单按钮控制地图

关灯直达底部

我们希望支持卫星地图、交通地图和街道地图。此外,还将给出一些菜单按钮,支持缩放及另一种获取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中包含的代码类似。