菜单是用户界面中最常见的元素之一,使用非常频繁,在Android中,菜单被分为如下几种:选项菜单(OptionsMenu)、上下文菜单(ContextMenu),子菜单(SubMenu),弹出菜单(PopupMenu)。
1.选项菜单和动作条(Options menu and action bar):
一个Activity中主要的菜单项的集合。在2.3或更低的版本中,用户可以按菜单键来调出选项菜单;在3.0或更高的版本上,可能没有菜单键,所以菜单项是通过动作条来呈现的
选项菜单包含两组菜单项:
图标菜单Icon Menu这个是当用户按下菜单键时最初出现屏幕下方的item集合。它支持最多6个菜单项。只有这些菜单支持图标而且这些菜单并不支持checkboxes或者radio buttons。
扩展菜单Expanded Menu这是通过按“更多”菜单显现出来的一个竖向的项目列表。它仅当图标菜单过多时存在而且是由6个以及其它选项菜单组成。
创建方法:
1)、覆盖Activity的onCreateOptionsMenu(Menu menu)方法,当我们第一次打开菜单时调用。
2)、调用Menu的add()方法添加菜单项(MenuItem),可以调用MenuItem的setIcon()方法为菜单项设置图标。
3)、当菜单项(MenuItem)被选中时,覆盖Acitivy的onOptionsMenuSelected()方法响应事件。
2.上下文菜单Context Menu和上下文动作条 contextual action mode;
当用户在某个元素上长按时的菜单。在3.0或更高本版上,应使用上下文动动作条。
上下文菜单Context Menu这是一个浮动菜单列表,通常在你长时间按在一个视图上时出现(比如一个列表项)
当用户长按Activity页面时,弹出的菜单我们称为上下文菜单。我们经常在Windows中用鼠标右键单击弹出的菜单就是上下文菜单。
1)、覆盖Activity的onCreateContextMenu()方法,调用Menu的add方法添加菜单项MenuItem
2)、覆盖onContextItemSelected()方法,响应菜单单击事件
3)、调用registerForContextMenu()方法,为视图注册上下文菜单
3、子菜单就是讲相同功能的分组进行多级显示的一种菜单,比如,Windows的“文件”菜单中就有“新建”,“打开”,“关闭”等子菜单。创建步骤如下:
1)、覆盖Activity的onCreateOptionMenu()方法,调用Menu的addSubMenu()方法添加子菜单项(Sub Menu)。
2)、调用SubMenu的add()方法,添加子菜单(Sub Menu)。
3)、覆盖onContextItemSelected()方法,添加子菜单单击事件。
4、弹出菜单(Popup menu): 弹出菜单会在调用它的View上显示一个垂直排列的列表。很适合作为动作条的溢出动作。
下面是代码布局及图片,在写布局前先在结构目录res文件夹下建一个menu子文件夹
上图中各按钮的实现效果没有截图,在下面的代码和布局中将有应用:
放在menu里面的xml布局如下:
main_options_menu.xml
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/action_menu" android:title="设置"/> <item android:id="@+id/exit_menu" android:title="退出"/> </menu> </span>
main_popup_menu.xml
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/popup1_titlie" android:title="选项"> <menu android:icon="@drawable/wallet_select_indicator" > <item android:title="新建"/> <item android:title="退出"/> </menu> </item> <item android:id="@+id/popup2_titlie" android:title="退出"/> </menu></span>
java代码MenuActivity.java
<span style="font-size:18px;">package com.sc.android.ui.menu; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; import android.widget.PopupMenu; import android.widget.Toast; import com.sc.android.R; public class MenuActivity extends Activity { private ListView mListView; private Button mCotextBtn, mPopupBtn; private ArrayAdapter<String> mAdapter; private PopupMenu mPopupMenu; private static final int ACTION_MENU = 0; private static final int EXIT_MENU = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_popup_listview_layout); mListView = (ListView) findViewById(R.id.popup_listsview); mCotextBtn = (Button) findViewById(R.id.context_menu_btn); mPopupBtn = (Button) findViewById(R.id.popup_menu_btn); mAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, getData()); mListView.setAdapter(mAdapter); registerForContextMenu(mCotextBtn); mListView.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { ArrayAdapter adpater = (ArrayAdapter) parent.getAdapter(); Toast.makeText(MenuActivity.this, "长按事件 : " + adpater.getItem(position), Toast.LENGTH_SHORT).show(); return false; } }); mPopupMenu = new PopupMenu(this, mPopupBtn); mPopupMenu.inflate(R.menu.main_popup_menu); mPopupBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mPopupMenu.show(); } }); } public ArrayList<String> getData() { ArrayList<String> list = new ArrayList<String>(); list.add("选项莱单"); list.add("上下文莱单"); list.add("弹出莱单"); return list; } // >>>>>>>>>>>>>>>选项菜单>>>>>>>>>>>>>>>>>>>>>> // 用xml布局实现 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_options_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_menu: Toast.makeText(this, "设置成功", Toast.LENGTH_SHORT).show(); break; case R.id.exit_menu: Toast.makeText(this, "退出", Toast.LENGTH_SHORT).show(); break; } return super.onOptionsItemSelected(item); } // >>>>>>>>>>>>>>>上下文菜单>>>>>>>>>>>>>>>>>>>> // 用代码布局实现 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.add(0, ACTION_MENU, 0, "设置"); menu.add(0, EXIT_MENU, 1, "退出"); super.onCreateContextMenu(menu, v, menuInfo); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case ACTION_MENU: Toast.makeText(this, "设置成功", Toast.LENGTH_SHORT).show(); break; case EXIT_MENU: Toast.makeText(this, "退出", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); } } </span>