1、Android的Menu简介
Android系统的Menu主要有三种:OptionsMenu、ContextMenu、SubMenu
自定义Menu可参考:http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html
2、OptionsMenu用法
2.1、创建Menu
按下Menu键时,屏幕底部就会弹出menu选项,提供选择。创建OptionsMenu的方法是在Activity类中复写onCreateOptionsMenu(),然后通过menu.add()方法添加各种选项,add方法的详细参数和返回值如下 :
public abstract MenuItem add (int groupId, int itemId, int order, CharSequence title)
groupId,组别,用来划分itemid的。一般为Menu.NONE
itemId,ID。是menu识别编号,供识别menu用的,很重要
order,顺序。这个参数的大小决定菜单选项出现的先后顺序。顺序按照参数由小到大
title,显示文本
返回值为turn时,menu才有效,若是 return false;则menu不能显示,也就是说menu无效。
复写方法onCreateOptionsMenu()时,就有个 return super.onCreateOptionsMenu(menu);,默认就行了。
添加menu选项例子:
menu.add(Menu.NONE,0,0,"添加").setIcon(android.R.drawable.ic_menu_add);
2.2、处理Menu
通过复写onOptionsItemSelected()方法即可,然后通过item.getItemId(),筛选不同的itemid,然后执行相应的方法
switch (item.getItemId()) {
case 0:
Toast.makeText(this, "添加", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, "方法还没定义", Toast.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
2.3、其他方法
onPrepareOptionsMenu()方法简述
点击menu按钮时,menu显示出来前,通过复写这个方法可以定义处理事件。
onOptionsMenuClosed()简述
退出menu之后,通过复写这个方法可以定义处理事件。menu按钮再被点击,back按钮被点击,或者用户选择了menu其中的一个选项,menu都会退出。
3、SubMenu用法
SubMenu实现的是子菜单功能,如“添加”的下一级菜单为“从网络添加”和“从本地添加两个选项的Menu”
SubMenu submenu=menu.addSubMenu(Menu.NONE, 0, 0, "添加")
.setIcon(android.R.drawable.ic_menu_add);
submenu.add(Menu.NONE, 10, 0, "从网络添加");
submenu.add(Menu.NONE, 11, 1, "从本地添加");
submenu.add()方法不能设置图标,设置了也是无效的;但是submenu本身可以设置图标,submenu.setIcon();
4、ContextMenu用法
长按某个View达2秒后,就弹出menu。创建的方法是复写onCreateContextMenu()方法,处理方法是onContextItemSelected()。因为是长按某一个View,所以ContextMenu要注册到目标view,才能实现。
注册方法如下(如,注册到一个EditText,长按这个EditText就可以调出Menu了),et是EditText的id
this.registerForContextMenu(findViewById(R.id.et));
onCreateContextMenu里面的add()/setIcon()方法不能添加图标,就算添加了,也不能显示出来的。在onCreateContextMenu方法里面也能设置submenu子菜单,方法参考第3点
public class MenuActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.registerForContextMenu(findViewById(R.id.et));
//注册到EditText,et是它的id
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
menu.add(Menu.NONE, 0, 0, "添加");
menu.add(Menu.NONE, 1, 1, "保存");
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case 0:
Toast.makeText(this, "添加", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, "方法还没定义", Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
}
5、自定义菜单
自定义菜单参考自:http://www.cnblogs.com/salam/archive/2011/04/04/2005329.html
完整代码如下:
<!-- 用于定义自定义Menu的布局 --> <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <GridView android:id="@+id/gridview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:numColumns="4" android:verticalSpacing="10dip" android:horizontalSpacing="10dip" android:stretchMode="columnWidth" android:gravity="center" /> </LinearLayout>
<!-- 用于定义Menu单个按钮的样式 --> <?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:contentDescription="@string/autoMenuIcon" android:id="@+id/item_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" > </ImageView> <TextView android:id="@+id/item_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/item_image" android:layout_centerHorizontal="true" android:text="@string/menuText" > </TextView> </RelativeLayout>
public class AndroidMenuActivity extends Activity { /** Called when the activity is first created. */ private boolean isMore = false;// menu菜单翻页控制 View menuView; GridView menuGrid; AlertDialog menuDialog;// menu菜单Dialog private final int ITEM_SEARCH = 0;// 搜索 private final int ITEM_FILE_MANAGER = 1;// 文件管理 private final int ITEM_DOWN_MANAGER = 2;// 下载管理 private final int ITEM_FULLSCREEN = 3;// 全屏 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 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //通过grid_view_menu.xml menuView = View.inflate(this, R.layout.grid_view_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) { // TODO Auto-generated method stub 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) { // TODO Auto-generated method stub 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 = 0; i < menuNameArray.length; i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("itemImage", imageResourceArray[i]); map.put("itemText", menuNameArray[i]); 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 } }