我們在上一篇介紹了如何在Android中建立和響應選項菜單,今天我們將探索子功能表和表徵圖菜單。
子功能表Sub Menu
子功能表提供了一種自然的組織功能表項目的方式,它被大量地運用在windows和其他OS的GUI設計中。Android同樣支援子功能表,你可以通過addSubMenu(int groupId, int itemId, int order, int titleRes)方法非常方便的建立和響應子功能表。
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
int base = Menu.FIRST;
// 一個menu可以包括多個子功能表
SubMenu subMenu = menu.addSubMenu(base, base+1, Menu.NONE, "系統設定");
// 子功能表可以包括多個功能表項目
MenuItem menuitem1 = subMenu.add(base, base+1, base+1, "顯示設定");
subMenu.add(base, base+2, base+2, "網路設定");
subMenu.add(base, base+3, base+3, "進階設定");
subMenu.add(base, base+4, base+4, "安全設定");
// 子功能表項不支援顯示表徵圖,這樣做是沒意義的,儘管不會報錯!
menuitem1.setIcon(R.drawable.displaysettings);
//但是子功能表本身是支援表徵圖的
subMenu.setIcon(R.drawable.settings);
// 顯示菜單請返回true
returntrue;
}
上面的代碼示範了如何建立子功能表,其功能表項目的響應其實就是普通功能表項目的響應,上一篇已經作了詳細介紹,這裡不再贅述。Android中可以為子功能表添加表徵圖,但是不會顯示其功能表項目的表徵圖,這一點需要留意。除了代碼中的setIcon(int iconRes)方法,還有一個setHeaderIcon(int iconRes)方法可以添加子功能表項欄目的標題表徵圖,效果如上面第三張圖。
最後需要強調的是,Menu可以包含多個SubMenu,SubMenu可以包含多個MenuItem(這三者之間的關係見Android菜單詳解(一)——理解Android中的Menu),但是SubMenu不能包含SubMenu,及子功能表不能嵌套!!!下面的代碼能通過編譯,但會在運行時出錯。
subMenu.addSubMenu("又一個子功能表");
表徵圖菜單Icon Menu
Android支援在菜單上顯示各種各樣的表徵圖,這一點我們在上面建立子功能表時已經用到了。表徵圖菜單嚴格上說並不算是一種菜單的新類型,它的使用也很簡單,之所以單獨設一節是為了說明使用Icon的一些限制。Android中並不是所謂的功能表項目都能加標,以下功能表項目都是不可以的(這並不意味著程式會報錯,而是運行時表徵圖得不到顯示):
- 擴充的功能表項目。如果不理解什麼是擴充的菜單,可以參考Android菜單詳解(一)——理解Android中的Menu
- 子功能表的功能表項目
- 操作功能表的功能表項目
除此以外,帶Icon的功能表項目不能加上複選框(check mark)。總之,雖然精美的表徵圖能給我們的應用增色不少,但是濫用表徵圖也是會適得其反的,Android SDK給表徵圖菜單加的這些限制也算是有效防止我們濫用表徵圖了吧。
結語
本篇介紹了Android中的子功能表和給功能表項目加Icon時需要注意的幾點,下一篇《Android菜單詳解(四)——使用操作功能表ContextMenu》將介紹操作功能表Context Menu的使用。