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參數,表示選項中顯示的文字。

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(); } }

效果圖:

       

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM