我們希望支持衛星地圖、交通地圖和街道地圖。此外,還將給出一些菜單按鈕,支持縮放及另一種獲取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中包含的代碼類似。