菜单是用户界面中最常见的元素之一,使用非常频繁,在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>