在Android中,菜单被分为如下三种,选项菜单(OptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu)
一、OptionsMenu
Paste_Image.png
1.res/menu下的activity_main.xml文件
菜单资源文件必须放在res/menu目录中。菜单资源文件必须使用
android:id="@+id/menu_settings"
android:orderInCategory="1"
android:icon="@drawable/home"
android:title="@string/menu_settings"/>
android:id="@+id/menu_about"
android:orderInCategory="2"
android:icon="@drawable/mine"
android:title="@string/menu_about"/>
android:id="@+id/menu_quit"
android:orderInCategory="3"
android:icon="@drawable/more"
android:title="@string/menu_quit"/>
2.MainActivity
package com.example.menutest;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;//返回true表示显示menu
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case R.id.menu_about:
Toast.makeText(MainActivity.this, ""+"关于", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_settings:
Toast.makeText(MainActivity.this, ""+"设置", Toast.LENGTH_SHORT).show();
break;
case R.id.menu_quit:
Toast.makeText(MainActivity.this, ""+"退出", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
//Toast.makeText(MainActivity.this, ""+item.getItemId(), Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
}
}
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):
单打开后发生的动作。
二、ContextMenu
参考Android菜单详解(四)——使用上下文菜单ContextMenu
在Windows中,我们已经习惯了在文件上单击右键来执行“打开”、“重命名”、“剪切”、“删除”等操作,这个右键弹出的菜单就是上下文菜单。
每个文件的操作
上下文菜单与Options Menu最大的不同在于,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们显示地通过registerForContextMenu(View view)来指定。
1.注册上下文菜单
/**
* 上下文菜单演示Demo
*
* @author CodingMyWorld 2011-8-27 下午03:22:39
*/
publicclass SampleContextMenuActivity extends ListActivity {
privatestaticfinal String TAG ="SampleContextMenuActivity";
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 显示列表
simpleShowList();
// 为所有列表项注册上下文菜单
this.registerForContextMenu(getListView());
}
privatevoid simpleShowList() {
// list item
String[] files =new String[] {
"文件1",
"文件2",
"文件3",
"文件4"
};
// simple array adapter
ArrayAdapter adapter =new ArrayAdapter(
this,
android.R.layout.simple_list_item_1,
files);
// set adapter
this.setListAdapter(adapter);
Log.v(TAG, "show simple list");
}
}
2.生成上下文菜单
@Override
publicvoid onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
Log.v(TAG, "populate context menu");
// set context menu title
menu.setHeaderTitle("文件操作");
// add context menu item
menu.add(0, 1, Menu.NONE, "发送");
menu.add(0, 2, Menu.NONE, "标记为重要");
menu.add(0, 3, Menu.NONE, "重命名");
menu.add(0, 4, Menu.NONE, "删除");
}
3.响应上下文菜单项
@Override
publicboolean onContextItemSelected(MenuItem item) {
// 得到当前被选中的item信息
AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
Log.v(TAG, "context item seleted ID="+ menuInfo.id);
switch(item.getItemId()) {
case1:
// do something
break;
case2:
// do something
break;
case3:
// do something
break;
case4:
// do something
break;
default:
return super.onContextItemSelected(item);
}
return true;
}
三、SubMenu
Paste_Image.png
Paste_Image.png
子菜单提供了一种自然的组织菜单项的方式,它被大量地运用在windows和其他OS的GUI设计中。Android同样支持子菜单,你可以通过addSubMenu(int groupId, int itemId, int order, int titleRes)方法非常方便的创建和响应子菜单。
@Override
publicboolean onCreateOptionsMenu(Menu menu) {
int base = Menu.FIRST;
// 一个menu可以包括多个子菜单
SubMenu subMenu = menu.addSubMenu(base, base+1, Menu.NONE, "系统设置");
// 子菜单可以包括多个菜单项
MenuItem menuitem1 = subMenu.add(base, base+1, base+1, "显示设置");
subMenu.add(base, base+2, base+2, "网络设置");
subMenu.add(base, base+3, base+3, "高级设置");
subMenu.add(base, base+4, base+4, "安全设置");
// 子菜单项不支持显示图标,这样做是没意义的,尽管不会报错!
menuitem1.setIcon(R.drawable.displaysettings);
//但是子菜单本身是支持图标的
subMenu.setIcon(R.drawable.settings);
// 显示菜单请返回true
return true;
}