android一共有三種形式的菜單:
1.選項菜單(optinosMenu)
2.上下文菜單(ContextMenu)
3.子菜單(subMenu)
一、選項菜單(optinosMenu)
選項菜單(optionsMenu), 該菜單在點擊 menu 按鍵 后會在對應的Activity底部顯示出來。
1、一般需要將創建選項菜單的代碼放在onCreateOptionMenu方法中。通過Menu.add方法可以添加一個選項菜單。該方法有4種重載形式,定義如下:
menu.add方法的參數:
第一個int類型的group ID參數,代表的是組概念,你可以將幾個菜單項歸為一組,以便更好的以組的方式管理你的菜單按鈕。
第二個int類型的item ID參數,代表的是項目編號。這個參數非常重要,一個item ID對應一個menu中的選項。在后面使用菜單的時候,就靠這個item ID來判斷你使用的是哪個選項。
第三個int類型的order ID參數,代表的是菜單項的顯示順序。默認是0,表示菜單的顯示順序就是按照add的顯示順序來顯示。
第四個String類型的title參數,表示選項中顯示的文字。
1、public MenuItem add(CharSequence title); 2、public MenuItem add(int titleRes); 3、public MenuItem add(int groupId, int itemId, int order, int titleRes); 4、public MenuItem add(int groupId, int itemId, int order, CharSequence title);
MainActivity.java文件:
menu.add(1,1,1,"菜單一"); menu.add(1,2,2,"菜單二"); menu.add(1,3,3,"菜單三"); menu.add(1,4,4,"菜單四");
效果圖:
2、為菜單添加圖標
在Android4.0系統中,創建菜單Menu,通過setIcon方法給菜單添加圖標是無效的,圖標沒有顯出來,2.3系統中是可以顯示出來的。這個問題的根本原因在於4.0系統中,涉及到菜單的源碼類 MenuBuilder做了改變,該類的部分源代碼如下:
public class MenuBuilder implements Menu { ... private boolean mOptionalIconsVisible = false; .... void setOptionalIconsVisible(boolean visible) { mOptionalIconsVisible = visible; } boolean getOptionalIconsVisible() { return mOptionalIconsVisible; } ... }
上面的代碼中,mOptionalIconsVisible成員初始值默認為false,這就是為什么給菜單設置圖標沒有效果的原因;所以,只要我們在創建菜單時通過調用setOptionalIconsVisible方法設置mOptionalIconsVisible為true就可以了;這時候問題來了,要想調用該方法,就需要創建MenuBuilder對象,但是,我們是無法在開發的應用程序中創建MenuBuilder這個對象(MenuBuilder為系統內部的框架類)。
這時候就需要考慮用反射了,在代碼運行創建菜單的時候通過反射調用setOptionalIconsVisible方法設置mOptionalIconsVisible為true,然后在給菜單添加Icon,這樣就可以在菜單中顯示添加的圖標了。
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
setIconEnable(menu, true);
//調用這句實現顯示ICON getMenuInflater().inflate(R.menu.main, menu); menu.add(1,1,1,"菜單一").setIcon(R.drawable.tabbar_me); menu.add(1,2,2,"菜單二").setIcon(R.drawable.tabbar_mainframehl); menu.add(1,3,3,"菜單三").setIcon(R.drawable.tabbar_mainframe); menu.add(1,4,4,"菜單四"
).setIcon(R.drawable.tabbar_mainframehl);
return true; }
//enable為true時,菜單添加圖標有效,enable為false時無效。4.0系統默認無效
private void setIconEnable(Menu menu, boolean enable)
{
try
{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
//MenuBuilder實現Menu接口,創建菜單時,傳進來的menu其實就是MenuBuilder對象(java的多態特征
m.invoke(menu, enable);
}catch(Exception e){
e.printStackTrace();
} }
效果圖:
3、實現菜單點擊效果:
①設置點擊事件:通過調用MenuItem.setOnMenuItemClickListener方法可以設置菜單項的單擊事件,該方法有一個OnMenuItemClickListener類型的參數類型的參數,處理菜單項的單擊事件類必須實現setOnMenuItemClickListener接口。
②setOnMenuItemClickListener()方法,繼承實現setOnMenuItemClickListener接口。
③通過getItemId()獲取menu中的選項對應item ID,可以用來做判斷,在判斷里面寫相關的代碼。
public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. //調用這句實現顯示ICON
setIconEnable(menu, true);
getMenuInflater().inflate(R.menu.main, menu);
Me nuItem item = menu.add(1,1,1,"菜單一").setIcon(R.drawable.tabbar_me); menu.add(1,2,2,"菜單二").setIcon(R.drawable.tabbar_mainframehl); menu.add(1,3,3,"菜單三").setIcon(R.drawable.tabbar_mainframe); menu.add(1,4,4,"菜單四").setIcon(R.drawable.tabbar_mainframehl); item.setOnMenuItemClickListener(this); return true; } public boolean onMenuItemClick(MenuItem item) { if(item.getItemId()==1){ Toast.makeText(MainActivity.this, "點擊了菜單項1", Toast.LENGTH_SHORT).show(); } return false; }
//enable為true時,菜單添加圖標有效,enable為false時無效。4.0系統默認無效
private void setIconEnable(Menu menu, boolean enable)
{
try{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
//MenuBuilder實現Menu接口,創建菜單時,傳進來的menu其實就是MenuBuilder對象(java的多態特征
m.invoke(menu, enable);
}catch(Exception e){
e.printStackTrace(); } }
效果圖: