讀古今文學網 > Android程序設計:第2版 > 通過菜單按鈕控制地圖 >

通過菜單按鈕控制地圖

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