Android 系统菜单与自定义菜单实现方法如下:
系统菜单显示DefaultMenu.java

[java] view plain copy
  1. packagecom.wxz.menu;
  2. importcom.wxz.menu.R;
  3. importandroid.app.Activity;
  4. importandroid.content.Intent;
  5. importandroid.os.Bundle;
  6. importandroid.view.Menu;
  7. importandroid.view.MenuItem;
  8. importandroid.view.View;
  9. importandroid.widget.Button;
  10. importandroid.widget.TextView;
  11. importandroid.widget.Toast;
  12. publicclassDefaultMenuextendsActivity{
  13. privateButtonbtnCustomizeMenu;
  14. privateTextViewtvTip;
  15. /**Calledwhentheactivityisfirstcreated.*/
  16. @Override
  17. publicvoidonCreate(BundlesavedInstanceState){
  18. super.onCreate(savedInstanceState);
  19. setContentView(R.layout.main);
  20. this.setTitle("Android系统菜单");
  21. btnCustomizeMenu=(Button)findViewById(R.id.btnCustomizeMenu);
  22. btnCustomizeMenu.setOnClickListener(newClickEvent());
  23. tvTip=(TextView)findViewById(R.id.tvTip);
  24. tvTip.setText("请按Menu键(F2)显示系统菜单");
  25. }
  26. classClickEventimplementsView.OnClickListener{
  27. @Override
  28. publicvoidonClick(Viewv){
  29. //TODOAuto-generatedmethodstub
  30. if(v==btnCustomizeMenu){
  31. Intentit=newIntent();
  32. it.setClass(DefaultMenu.this,CustomizeMenu.class);
  33. startActivity(it);
  34. }
  35. }
  36. }
  37. @Override
  38. publicbooleanonCreateOptionsMenu(Menumenu){
  39. /*
  40. *
  41. *add()方法的四个参数,依次是:
  42. *
  43. *1、组别,如果不分组的话就写Menu.NONE,
  44. *
  45. *2、Id,这个很重要,Android根据这个Id来确定不同的菜单
  46. *
  47. *3、顺序,那个菜单现在在前面由这个参数的大小决定
  48. *
  49. *4、文本,菜单的显示文本
  50. */
  51. menu.add(Menu.NONE,Menu.FIRST+1,2,"删除").setIcon(
  52. android.R.drawable.ic_menu_delete);
  53. //setIcon()方法为菜单设置图标,这里使用的是系统自带的图标,以
  54. //android.R开头的资源是系统提供的,我们自己提供的资源是以R开头的
  55. menu.add(Menu.NONE,Menu.FIRST+2,3,"保存").setIcon(
  56. android.R.drawable.ic_menu_edit);
  57. menu.add(Menu.NONE,Menu.FIRST+3,4,"帮助").setIcon(
  58. android.R.drawable.ic_menu_help);
  59. menu.add(Menu.NONE,Menu.FIRST+4,1,"添加").setIcon(
  60. android.R.drawable.ic_menu_add);
  61. //返回true则显示,返回false则不显示
  62. returntrue;
  63. }
  64. @Override
  65. publicbooleanonOptionsItemSelected(MenuItemitem){
  66. switch(item.getItemId()){
  67. caseMenu.FIRST+1:
  68. Toast.makeText(this,"删除菜单被点击了",Toast.LENGTH_LONG).show();
  69. break;
  70. caseMenu.FIRST+2:
  71. Toast.makeText(this,"保存菜单被点击了",Toast.LENGTH_LONG).show();
  72. break;
  73. caseMenu.FIRST+3:
  74. Toast.makeText(this,"帮助菜单被点击了",Toast.LENGTH_LONG).show();
  75. break;
  76. caseMenu.FIRST+4:
  77. Toast.makeText(this,"添加菜单被点击了",Toast.LENGTH_LONG).show();
  78. break;
  79. }
  80. //返回false则正常显示,返回true则被消费掉
  81. returnfalse;
  82. }
  83. @Override
  84. publicvoidonOptionsMenuClosed(Menumenu){
  85. Toast.makeText(this,"选项菜单关闭了",Toast.LENGTH_LONG).show();
  86. }
  87. @Override
  88. publicbooleanonPrepareOptionsMenu(Menumenu){
  89. Toast.makeText(this,
  90. "选项菜单显示之前onPrepareOptionsMenu方法会被调用,你可以用此方法来根据打当时的情况调整菜单",
  91. Toast.LENGTH_LONG).show();
  92. //如果返回false,此方法就把用户点击menu的动作给消费了,onCreateOptionsMenu方法将不会被调用
  93. returntrue;
  94. }
  95. }

自定义菜单显示CustomizeMenu.java

[java] view plain copy
  1. packagecom.wxz.menu;
  2. importjava.util.ArrayList;
  3. importjava.util.HashMap;
  4. importcom.wxz.menu.R;
  5. importandroid.app.Activity;
  6. importandroid.app.AlertDialog;
  7. importandroid.content.Context;
  8. importandroid.content.DialogInterface;
  9. importandroid.content.Intent;
  10. importandroid.content.DialogInterface.OnKeyListener;
  11. importandroid.os.Bundle;
  12. importandroid.view.KeyEvent;
  13. importandroid.view.Menu;
  14. importandroid.view.View;
  15. importandroid.widget.AdapterView;
  16. importandroid.widget.Button;
  17. importandroid.widget.GridView;
  18. importandroid.widget.SimpleAdapter;
  19. importandroid.widget.TextView;
  20. importandroid.widget.Toast;
  21. importandroid.widget.AdapterView.OnItemClickListener;
  22. publicclassCustomizeMenuextendsActivity{
  23. privateButtonbtnCustomizeMenu;
  24. privateButtonbtnDefaultMenu;
  25. privateTextViewtvTip;
  26. privateContextmContext;
  27. privatebooleanisMore=true;//menu菜单翻页控制
  28. AlertDialogmenuDialog;//menu菜单Dialog
  29. GridViewmenuGrid;
  30. ViewmenuView;
  31. //菜单图片
  32. int[]menu_image_array={R.drawable.menu_search,
  33. R.drawable.menu_bookmark,R.drawable.menu_bookmark_sync_import,
  34. R.drawable.menu_sharepage,R.drawable.menu_quit,
  35. R.drawable.menu_nightmode,R.drawable.menu_refresh,
  36. R.drawable.menu_more};
  37. //菜单文字
  38. String[]menu_name_array={"搜索","书签","加入书签","分享页面","退出","夜间模式",
  39. "刷新","更多"};
  40. //菜单图片2
  41. int[]menu_image_array2={R.drawable.menu_auto_landscape,
  42. R.drawable.menu_checkupdate,R.drawable.menu_checknet,
  43. R.drawable.menu_refreshtimer,R.drawable.menu_syssettings,
  44. R.drawable.menu_help,R.drawable.menu_about,R.drawable.menu_return};
  45. //菜单文字2
  46. String[]menu_name_array2={"自动横屏","检查更新","检查网络","定时刷新","设置","帮助",
  47. "关于","返回"};
  48. @Override
  49. protectedvoidonCreate(BundlesavedInstanceState){
  50. //TODOAuto-generatedmethodstub
  51. super.onCreate(savedInstanceState);
  52. setContentView(R.layout.main);
  53. mContext=CustomizeMenu.this;
  54. this.setTitle("Android自定义菜单");
  55. btnCustomizeMenu=(Button)findViewById(R.id.btnCustomizeMenu);
  56. btnCustomizeMenu.setVisibility(View.GONE);
  57. btnDefaultMenu=(Button)findViewById(R.id.btnDefaultMenu);
  58. btnDefaultMenu.setVisibility(View.VISIBLE);
  59. btnDefaultMenu.setOnClickListener(newClickEvent());
  60. tvTip=(TextView)findViewById(R.id.tvTip);
  61. tvTip.setText("请按Menu键(F2)显示自定义菜单");
  62. menuView=View.inflate(this,R.layout.gridview_menu,null);
  63. //创建AlertDialog
  64. menuDialog=newAlertDialog.Builder(this).create();
  65. menuDialog.setView(menuView);
  66. menuDialog.setOnKeyListener(newOnKeyListener(){
  67. publicbooleanonKey(DialogInterfacedialog,intkeyCode,
  68. KeyEventevent){
  69. if(keyCode==KeyEvent.KEYCODE_MENU)//监听按键
  70. dialog.dismiss();
  71. returnfalse;
  72. }
  73. });
  74. menuGrid=(GridView)menuView.findViewById(R.id.gridview);
  75. menuGrid.setAdapter(getMenuAdapter(menu_name_array,menu_image_array));
  76. /**监听menu选项**/
  77. menuGrid.setOnItemClickListener(newOnItemClickListener(){
  78. publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,
  79. longarg3){
  80. switch(arg2){
  81. case0://搜索,自动横屏
  82. if(isMore)
  83. Toast.makeText(mContext,"点击了搜索",Toast.LENGTH_SHORT).show();
  84. else
  85. Toast.makeText(mContext,"点击了自动横屏",Toast.LENGTH_SHORT).show();
  86. break;
  87. case1://书签,检查更新
  88. if(isMore)
  89. Toast.makeText(mContext,"点击了书签",Toast.LENGTH_SHORT).show();
  90. else
  91. Toast.makeText(mContext,"点击了检查更新",Toast.LENGTH_SHORT).show();
  92. break;
  93. case2://加入书签,检查网络
  94. if(isMore)
  95. Toast.makeText(mContext,"点击了加入书签",Toast.LENGTH_SHORT).show();
  96. else
  97. Toast.makeText(mContext,"点击了检查网络",Toast.LENGTH_SHORT).show();
  98. break;
  99. case3://分享页面,定时刷新
  100. if(isMore)
  101. Toast.makeText(mContext,"点击了分享页面",Toast.LENGTH_SHORT).show();
  102. else
  103. Toast.makeText(mContext,"点击了定时刷新",Toast.LENGTH_SHORT).show();
  104. break;
  105. case7://更多
  106. if(isMore){
  107. menuGrid.setAdapter(getMenuAdapter(menu_name_array2,
  108. menu_image_array2));
  109. isMore=false;
  110. }else{//首页
  111. menuGrid.setAdapter(getMenuAdapter(menu_name_array,
  112. menu_image_array));
  113. isMore=true;
  114. }
  115. menuGrid.invalidate();//更新menu
  116. menuGrid.setSelection(7);
  117. break;
  118. default://退出,夜间模式,刷新,设置,帮助,关于
  119. Toast.makeText(mContext,"点击了其它菜单项",Toast.LENGTH_SHORT).show();
  120. break;
  121. }
  122. }
  123. });
  124. }
  125. classClickEventimplementsView.OnClickListener{
  126. @Override
  127. publicvoidonClick(Viewv){
  128. //TODOAuto-generatedmethodstub
  129. if(v==btnDefaultMenu){
  130. Intentit=newIntent();
  131. it.setClass(CustomizeMenu.this,DefaultMenu.class);
  132. startActivity(it);
  133. }
  134. }
  135. }
  136. @Override
  137. publicbooleanonCreateOptionsMenu(Menumenu){
  138. menu.add("menu");//必须创建一项
  139. returnsuper.onCreateOptionsMenu(menu);
  140. }
  141. privateSimpleAdaptergetMenuAdapter(String[]menuNameArray,
  142. int[]imageResourceArray){
  143. ArrayList<HashMap<String,Object>>data=newArrayList<HashMap<String,Object>>();
  144. for(inti=0;i<menuNameArray.length;i++){
  145. HashMap<String,Object>map=newHashMap<String,Object>();
  146. map.put("itemImage",imageResourceArray[i]);
  147. map.put("itemText",menuNameArray[i]);
  148. data.add(map);
  149. }
  150. SimpleAdaptersimperAdapter=newSimpleAdapter(this,data,
  151. R.layout.item_menu,newString[]{"itemImage","itemText"},
  152. newint[]{R.id.item_image,R.id.item_text});
  153. returnsimperAdapter;
  154. }
  155. @Override
  156. publicbooleanonMenuOpened(intfeatureId,Menumenu){
  157. if(menuDialog==null){
  158. menuDialog=newAlertDialog.Builder(this).setView(menuView).show();
  159. }else{
  160. menuDialog.show();
  161. }
  162. returnfalse;//返回为true则显示系统menu
  163. }
  164. }

主配置文件main.xml

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <TextView
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:text="请点击Menu键(F2)显示选项菜单"
  9. android:id="@+id/tvTip"/>
  10. <Button
  11. android:id="@+id/btnCustomizeMenu"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="自定义菜单"/>
  15. <Button
  16. android:id="@+id/btnDefaultMenu"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:visibility="gone"
  20. android:text="系统菜单"/>
  21. </LinearLayout>

菜单布局表格配置文件gridview_menu.xml

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <GridView
  8. android:id="@+id/gridview"
  9. android:layout_width="fill_parent"
  10. android:layout_height="fill_parent"
  11. android:numColumns="4"
  12. android:verticalSpacing="10dip"
  13. android:horizontalSpacing="10dip"
  14. android:stretchMode="columnWidth"
  15. android:gravity="center"
  16. />
  17. </LinearLayout>

菜单项配置文件item_menu.xml

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/RelativeLayout_Item"
  4. android:layout_width="fill_parent"
  5. android:layout_height="wrap_content"
  6. android:paddingBottom="5dip">
  7. <ImageView
  8. android:id="@+id/item_image"
  9. android:layout_centerHorizontal="true"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content">
  12. </ImageView>
  13. <TextView
  14. android:layout_below="@id/item_image"
  15. android:id="@+id/item_text"
  16. android:layout_centerHorizontal="true"
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:text="选项">
  20. </TextView>
  21. </RelativeLayout>


开发环境:XP3+Eclipse+Android2.2+JDK6.0
测试环境:Android2.2模拟器

更多相关文章

  1. android 一直在最前面的浮动窗口效果
  2. 接收短信启动相应服务
  3. ImageView.setScalType参数详解
  4. Android软键盘使用
  5. 介绍一个Android开源项目:GifView——Android显示GIF动画
  6. GridView做所有程序主菜单
  7. android 点击返回键退出程序的方法
  8. Android(安卓)SDK 自带项目GestureBuilderActivity
  9. android Gallery(画廊)以及BaseAdapter

随机推荐

  1. 深入Android开发FAQ的详解
  2. [置顶] android图形系统详解六:View layer
  3. Android添加可拖动、点击的悬浮窗口
  4. React Native 中的状态栏(Android沉浸式)
  5. 整个网络可能最完善的 Android(安卓)自定
  6. Socket 通信原理 -- Android客户端和服务
  7. android 显示图片的指定位置图像 ImageVi
  8. C# 实现本地推送示例
  9. Android之Handler总结与Timer和TimerTask
  10. Android(安卓)Studio 下拉框Spinner实例