android menu菜單控件

菜單是用戶界面中最常見的元素之一,使用非常頻繁,在Android中,菜單被分為如下三種,選項菜單(OptionsMenu)、上下文菜單(ContextMenu)和子菜單(SubMenu),今天這講是OptionsMenu 

  一、概述

  public boolean onCreateOptionsMenu(Menu menu):使用此方法調用OptionsMenu 。

  public boolean onOptionsItemSelected(MenuItem item):選中菜單項後發生的動作。

  public void onOptionsMenuClosed(Menu menu):菜單關閉後發生的動作。

  public boolean onPrepareOptionsMenu(Menu menu):選項菜單顯示之前onPrepareOptionsMenu方法會被調用,你可以用此方法來根據打當時的情況調整菜單。

  public boolean onMenuOpened(int featureId, Menu menu):單打開後發生的動作。

  二、默認樣式

  默認樣式是在屏幕底部彈出一個菜單,這個菜單我們就叫他選項菜單OptionsMenu,一般情況下,選項菜單最多顯示2排每排3個菜單項,這些菜單項有文字有圖標,也被稱作Icon Menus,如果多於6項,從第六項開始會被隱藏,在第六項會出現一個More裡,點擊More才出現第六項以及以後的菜單項,這些菜單項也被稱作Expanded Menus。下面介紹。


 1.main.xml  
<? xml version 1.0 encoding utf-8 ?> 
LinearLayout xmlns:android http://schemas.android.com/apk/res/android 
    android:orientation 
vertical android:layout_width fill_parent 
    android:layout_height 
fill_parent 
    
    
TextView android:layout_width wrap_content 
        android:layout_height 
wrap_content android:text 請點擊Menu鍵顯示選項菜單
        android:id 
@+id/ TextView02 /> 

</ LinearLayout >


  2。重載onCreateOptionsMenu(Menu menu)方法

  重載onCreateOptionsMenu(Menu menu)方法,並在此方法中添加菜單項,最後返回true,如果false,菜單則不會顯示。


public boolean onCreateOptionsMenu(Menu menu)
@Override 
    
public boolean onCreateOptionsMenu(Menu menu) { 
        
/* 
         * 
         * add()方法的四個參數,依次是:
         * 
         * 1、組別,如果不分組的話就寫Menu.NONE, 
         * 
         * 2、Id,這個很重要,Android根據這個Id來確定不同的菜單
         * 
         * 3、順序,那個菜單現在在前面由這個參數的大小決定
         * 
         * 4、文本,菜單的顯示文本
         
*/ 

        menu.add(Menu.NONE, Menu .FIRST 
刪除).setIcon(         android.R.drawable.ic_menu_delete); 



        
// setIcon()方法為菜單設置圖標,這裡使用的是系統自帶的圖標,同學們留意一下,以

        
// android.R開頭的資源是系統提供的,我們自己提供的資源是以R開頭的

        menu.add(Menu.NONE, Menu.FIRST 
保存).setIcon(         android.R. drawable.ic_menu_edit);         menu.add(Menu.NONE, Menu.FIRST 



幫助).setIcon(         android.R.drawable.ic_menu_help);         menu.add(Menu.NONE, Menu.FIRST 



添加).setIcon(         android.R.drawable.ic_menu_add);         menu.add(Menu.NONE, Menu.FIRST 



詳細).setIcon(         android.R.drawable.ic_menu_info_details) ;         menu.add(Menu.NONE, Menu.FIRST 



發送).setIcon(         android.R.drawable.ic_menu_send); 



        
return true     }




  3。為菜單項註冊事件

  使用onOptionsItemSelected(MenuItem item)方法為菜單項註冊事件

public boolean onOptionsItemSelected(MenuItem item)
@Override 
    
public boolean onOptionsItemSelected(MenuItem item) { 
        
switch (item.getItemId()) { 

        
case Menu.FIRST             Toast.makeText( 

this 刪除菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break 

        
case Menu.FIRST             Toast.makeText( 

this 保存菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break 

        
case Menu.FIRST             Toast.makeText( 

this 幫助菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break 

        
case Menu.FIRST             Toast.makeText( 

this 添加菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break 

        
case Menu. FIRST             Toast.makeText( 

this 詳細菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break 

        
case Menu.FIRST             Toast.makeText( 

this 發送菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break         } 



        
return false     }




  4。其他按需要重載

  完整代碼

DefaultMenu
package com.wjq.menu; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; 







public class DefaultMenu extends Activity { 
    
/* * Called when the activity is first created. */ 
    @Override 
    
public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
    }     @Override 


    
public boolean onCreateOptionsMenu(Menu menu) { 
        
/* 
         * 
         * add()方法的四個參數,依次是:
         * 
         * 1、組別,如果不分組的話就寫Menu.NONE, 
         * 
         * 2、Id,這個很重要,Android根據這個Id來確定不同的菜單
         * 
         * 3、順序,那個菜單現在在前面由這個參數的大小決定
         * 
         * 4、文本,菜單的顯示文本
         
*/ 

        menu.add(Menu.NONE, Menu.FIRST 
刪除). setIcon(         android.R.drawable.ic_menu_delete); 



        
// setIcon()方法為菜單設置圖標,這裡使用的是系統自帶的圖標,同學們留意一下,以

        
// android.R開頭的資源是系統提供的,我們自己提供的資源是以R開頭的

        menu.add(Menu.NONE, Menu.FIRST 
保存).setIcon(         android.R.drawable.ic_menu_edit);         menu.add(Menu.NONE , Menu.FIRST 



幫助).setIcon(         android.R.drawable.ic_menu_help);         menu.add(Menu.NONE, Menu.FIRST 



添加).setIcon(         android. R.drawable.ic_menu_add);         menu.add(Menu.NONE, Menu.FIRST 



詳細).setIcon(         android.R.drawable.ic_menu_info_details);         menu.add(Menu.NONE, Menu.FIRST 



發送).setIcon(         android.R.drawable.ic_menu_send); 



        
return true     }     @Override 




    
public boolean onOptionsItemSelected(MenuItem item) { 
        
switch (item.getItemId()) { 

        
case Menu.FIRST             Toast.makeText( 

this 刪除菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break 

        
case Menu.FIRST             Toast.makeText( 

this 保存菜單被點擊了, Toast.LENGTH_LONG ).show(); 

            
break 

        
case Menu.FIRST             Toast.makeText( 

this 幫助菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break 

        
case Menu.FIRST             Toast.makeText ( 

this 添加菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break 

        
case Menu.FIRST             Toast.makeText( 

this 詳細菜單被點擊了, Toast.LENGTH_LONG).show( ); 

            
break 

        
case Menu.FIRST             Toast.makeText( 

this 發送菜單被點擊了, Toast.LENGTH_LONG).show(); 

            
break         } 



        
return false     }     @Override 




    
public void onOptionsMenuClosed(Menu menu) { 
        Toast.makeText( 
this 選項菜單關閉了, Toast.LENGTH_LONG).show(); 
    }     @Override 


    
public boolean onPrepareOptionsMenu(Menu menu) { 
        Toast.makeText( 
this 
                
選項菜單顯示之前onPrepareOptionsMenu方法會被調用,你可以用此方法來根據打當時的情況調整菜單
                Toast.LENGTH_LONG).show(); 

        
// 如果返回false,此方法就把用戶點擊menu的動作給消費了,onCreateOptionsMenu方法將不會被調用

        
return true     } }





5.效果瀏覽

   

  三、自定義樣式


1.gridview_menu.xml
<? xml version 1.0 encoding utf-8 ?> 
LinearLayout xmlns:android http://schemas.android.com/apk/res/android 
    android:orientation 
vertical 
    android:layout_width 
fill_parent 
    android:layout_height 
fill_parent 
    

GridView 
         android:id 
@+id/gridview 
         android:layout_width 
fill_parent 
         android:layout_height 
fill_parent 
         android:numColumns 

         android:verticalSpacing 
10dip 
         android:horizontalSpacing 
10dip 
         android:stretchMode 
columnWidth 
         android:gravity 
center 
         
/> 
  
</ LinearLayout >


   首先自定義菜單界面,我是GridView來包含菜單項,4列3行


2.item_menu.xml
<? xml version 1.0 encoding utf-8 ?> 
RelativeLayout xmlns:android http://schemas.android.com/apk/res/android 
    android:id 
@+id/RelativeLayout_Item 
    android:layout_width 
fill_parent android:layout_height wrap_content 
    android:paddingBottom 
5dip 
    
ImageView android:id @+id/item_image 
        android:layout_centerHorizontal 
true android:layout_width wrap_content 
        android:layout_height 
wrap_content ></ ImageView 
    
TextView android:layout_below @id/item_image android:id @+id/item_text 
        android:layout_centerHorizontal 
true android:layout_width wrap_content 
        android :layout_height 
wrap_content android:text 選項></ TextView 
</ RelativeLayout >


菜單項的現實樣式,一個圖標和一個文字。

  3.定義


代碼
private boolean isMore false // menu菜單翻頁控制
    AlertDialog menuDialog; // menu菜單Dialog 
    GridView menuGrid; 
    View menuView; 
    
    
private final int ITEM_SEARCH // 搜索
    private final int ITEM_FILE_MANAGER // 文件管理
    private final int ITEM_DOWN_MANAGER // 下載管理
    private final int ITEM_FULLSCREEN // 全屏
    private final int ITEM_MORE 11 // 菜單

    
    
/* *菜單圖片* */ 
    
int [] menu_image_array { R.drawable.menu_search, 
            R .drawable.menu_filemanager, R.drawable.menu_downmanager, 
            R.drawable.menu_fullscreen, R.drawable.menu_inputurl, 
            R.drawable.menu_bookmark, R.drawable.menu_bookmark_sync_import, 
            R.drawable.menu_sharepage, R.drawable.menu_quit, 
            R.drawable .menu_nightmode, R.drawable.menu_refresh, 
            R.drawable.menu_more }; 
    
/* *菜單文字* */ 
    String[] menu_name_array 
搜索文件管理下載管理全屏網址書籤
            
加入書籤分享頁面退出夜間模式刷新更多}; 
    
/* *菜單圖片2 * */ 
    
int [] menu_image_array2 { R.drawable.menu_auto_landscape, 
            R.drawable.menu_penselectmodel, R.drawable.menu_page_attr, 
            R.drawable.menu_novel_mode, R.drawable.menu_page_updown, 
            R.drawable.menu_checkupdate, R.drawable.menu_checknet, 
            R.drawable.menu_refreshtimer, R. drawable.menu_syssettings, 
            R.drawable.menu_help, R.drawable.menu_about, R.drawable.menu_return }; 
    
/* *菜單文字2 * */ 
    String[] menu_name_array2 
自動橫屏筆選模式閱讀模式瀏覽模式快捷翻頁
            
檢查更新檢查網絡定時刷新設置幫助關於返回};


4.public boolean onMenuOpened(int featureId, Menu menu)
@Override 
    
public boolean onMenuOpened( int featureId, Menu menu) { 
        
if (menuDialog == null ) { 
            menuDialog 
new AlertDialog.Builder( this ).setView(menuView).show(); 
        } 
else 
            menuDialog.show(); 
        } 
        
return false // 返回為true則顯示系統menu 
    }


如果第一次打開則設置視圖,否則直接顯示menuDialog視圖。


5.private SimpleAdapter getMenuAdapter(String[] menuNameArray,
private SimpleAdapter getMenuAdapter(String[] menuNameArray, 
            
int [] imageResourceArray) { 
        ArrayList 
HashMap String, Object >> data new ArrayList HashMap String, Object >> (); 
        
for int ; i menuNameArray. length; i ++ ) { 
            HashMap 
String, Object map new HashMap String, Object (); 
            map.put( 
itemImage , imageResourceArray ); 
            map.put( 
itemText , menuNameArray ); 
            data.add (map); 
        } 
        SimpleAdapter simperAdapter 
new SimpleAdapter( this , data, 
                R.layout.item_menu, 
new String[] { itemImage itemText }, 
                
new int [] { R.id.item_image, R.id. item_text }); 
        
return simperAdapter; 
    }



為菜單添加菜單項。

6.public boolean onCreateOptionsMenu(Menu menu) @Override 
    
public boolean onCreateOptionsMenu(Menu menu) { 
        menu.add( 
menu ); // 必須創建一項
        return super.onCreateOptionsMenu(menu); 
    } 


7.protected void onCreate(Bundle savedInstanceState)
@Override 
    
protected void onCreate(Bundle savedInstanceState) { 
        
// TODO Auto-generated method stub 
        super.onCreate(savedInstanceState);         setContentView(R.layout.main);         menuView 
        

        
View.inflate( this , R.layout.gridview_menu, null ) ; 
        
// 創建AlertDialog 
        menuDialog new AlertDialog.Builder( this ).create(); 
        menuDialog.setView(menuView); 
        menuDialog.setOnKeyListener( 
new OnKeyListener() { 
            
public boolean onKey(DialogInterface dialog, int keyCode, 
                    KeyEvent 
event ) { 
                
if (keyCode == KeyEvent.KEYCODE_MENU) // 監聽按鍵
                    dialog.dismiss(); 
                
return false 
            } 
        });         menuGrid 

(GridView) menuView.findViewById(R.id.gridview); 
        menuGrid.setAdapter(getMenuAdapter(menu_name_array, menu_image_array )); 
        
/* *監聽menu選項* */ 
        menuGrid.setOnItemClickListener( 
new OnItemClickListener() { 
            
public void onItemClick(AdapterView <?> arg0, View arg1, int arg2, 
                    
long arg3) { 
                
switch (arg2) { 
                
case ITEM_SEARCH: / / 搜索

                    
break 
                
case ITEM_FILE_MANAGER: // 文件管理

                    
break 
                
case ITEM_DOWN_MANAGER: // 下載管理

                    
break 
                
case ITEM_FULLSCREEN: // 全屏

                    
break 
                
case ITEM_MORE: // 翻頁
                    if (isMore) { 
                        menuGrid.setAdapter(getMenuAdapter(menu_name_array2, 
                                menu_image_array2)); 
                        isMore 
false 
                    } 
else // 首頁
                        menuGrid.setAdapter(getMenuAdapter(menu_name_array, 
                                menu_image_array)); 
                        isMore 
true 
                    } 
                    menuGrid.invalidate(); 
// 更新menu 
                    menuGrid.setSelection(ITEM_MORE); 
                    
break 
                }             }         });     }
                
                





完整代碼
package com.wjq.menu; import java.util.ArrayList; import java.util.HashMap; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.DialogInterface.OnKeyListener ; import android.os.Bundle; import android.view.KeyEvent; import android.view.Menu; import android.view.View; import android.widget.AdapterView; import android.widget.GridView; import android.widget.SimpleAdapter; import android.widget.AdapterView.OnItemClickListener; 


















public class CustomizeMenu extends Activity { 
    
    
private boolean isMore false // menu菜單翻頁控制
    AlertDialog menuDialog; // menu菜單Dialog 
    GridView menuGrid; 
    View menuView; 
    
    
private final int ITEM_SEARCH / / 搜索
    private final int ITEM_FILE_MANAGER // 文件管理
    private final int ITEM_DOWN_MANAGER // 下載管理
    private final int ITEM_FULLSCREEN // 全屏
    private final int ITEM_MORE 11 // 菜單

    
    
/* *菜單圖片* */ 
    
int [] menu_image_array { R.drawable.menu_search, 
            R.drawable.menu_filemanager, R.drawable.menu_downmanager, 
            R.drawable.menu_fullscreen, R.drawable.menu_inputurl, 
            R.drawable.menu_bookmark, R.drawable.menu_bookmark_sync_import, 
            R.drawable.menu_sharepage, R.drawable.menu_quit, 
            R.drawable.menu_nightmode, R.drawable.menu_refresh, 
            R.drawable.menu_more }; 
    
/* *菜單文字* */ 
    String[] menu_name_array 
搜索文件管理下載管理全屏網址書籤
            
加入書籤分享頁面退出夜間模式刷新更多}; 
    
/* *菜單圖片2 * */ 
    
int [] menu_image_array2 { R.drawable.menu_auto_landscape, 
            R.drawable.menu_penselectmodel, R.drawable.menu_page_attr, 
            R.drawable.menu_novel_mode, R.drawable.menu_page_updown, 
            R.drawable.menu_checkupdate , R.drawable.menu_checknet, 
            R.drawable.menu_refreshtimer, R.drawable.menu_syssettings, 
            R.drawable.menu_help, R.drawable.menu_about, R.drawable.menu_return }; 
    
/* *菜單文字2 * */ 
    String[] menu_name_array2 
自動橫屏筆選模式閱讀模式瀏覽模式快捷翻頁
            
檢查更新檢查網絡定時刷新設置幫助關於返回}; 
    @Override 
    
protected void onCreate(Bundle savedInstanceState) { 
        
// TODO Auto-generated method stub 
        super.onCreate(savedInstanceState);         setContentView(R.layout.main);         menuView 
        

        
View .inflate( this , R.layout.gridview_menu, null ); 
        
// 創建AlertDialog 
        menuDialog new AlertDialog.Builder( this ).create(); 
        menuDialog.setView(menuView); 
        menuDialog.setOnKeyListener( 
new OnKeyListener() { 
            
public boolean onKey(DialogInterface dialog, int keyCode, 
                    KeyEvent 
event ) { 
                
if (keyCode == KeyEvent.KEYCODE_MENU) // 監聽按鍵
                    dialog.dismiss(); 
                
return false 
            } 
        });         menuGrid 

(GridView) menuView.findViewById(R.id .gridview); 
        menuGrid.setAdapter(getMenuAdapter(menu_name_array, menu_image_array)); 
        
/* *監聽menu選項* */ 
        menuGrid.setOnItemClickListener( 
new OnItemClickListener() { 
            
public void onItemClick(AdapterView <?> arg0, View arg1, int arg2, 
                    
long arg3) { 
                
switch (arg2) { 
                
case ITEM_SEARCH: // 搜索

                    
break 
                
case ITEM_FILE_MANAGER: // 文件管理

                    
break 
                
case ITEM_DOWN_MANAGER: // 下載管理

                    
break 
                
case ITEM_FULLSCREEN: // 全屏

                    
break 
                
case ITEM_MORE: // 翻頁
                    if (isMore) { 
                        menuGrid.setAdapter(getMenuAdapter(menu_name_array2, 
                                menu_image_array2)); 
                        isMore 
false 
                    } 
else // 首頁
                        menuGrid.setAdapter(getMenuAdapter(menu_name_array, 
                                menu_image_array)); 
                        isMore 
true 
                    } 
                    menuGrid.invalidate(); 
// 更新menu 
                    menuGrid.setSelection(ITEM_MORE); 
                    
break 
                }             }         });     }     @Override 
                
                




    
public boolean onCreateOptionsMenu(Menu menu) { 
        menu.add( 
menu ); // 必須創建一項
        return super.onCreateOptionsMenu(menu ); 
    } 
    
    
private SimpleAdapter getMenuAdapter(String[] menuNameArray, 
            
int [] imageResourceArray) { 
        ArrayList 
HashMap String, Object >> data new ArrayList HashMap String, Object >> (); 
        
for int ; i menuNameArray.length; i ++ ) { 
            HashMap 
String, Object map new HashMap String, Object (); 
            map.put( 
itemImage , imageResourceArray ); 
            map.put( 
itemText , menuNameArray ); 
            data.add(map); 
        } 
        SimpleAdapter simperAdapter 
new SimpleAdapter( this , data, 
                R.layout.item_menu, 
new String[] { itemImage itemText }, 
                
new int [] { R.id.item_image, R .id.item_text }); 
        
return simperAdapter; 
    } 
    @Override 
    
public boolean onMenuOpened( int featureId, Menu menu) { 
        
if (menuDialog == null ) { 
            menuDialog 
new AlertDialog.Builder( this ).setView(menuView).show() ; 
        } 
else 
            menuDialog.show(); 
        } 
        
return false // 返回為true則顯示系統menu 
    } }
    



原代碼下載點擊這裡

效果瀏覽

   

         


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值