Android开发之选项菜单(optinosMenu)
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參數,表示選項中顯示的文字。
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.//調用這句實現顯示ICONsetIconEnable(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(); } }
效果圖:
? ? ? ?
?
轉載于:https://www.cnblogs.com/wdht/p/6099582.html
總結
以上是生活随笔為你收集整理的Android开发之选项菜单(optinosMenu)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode_438_Find Al
- 下一篇: 字符识别(模板匹配BP神经网络训练)