1. 菜单分为option menu 和 context menu (右键菜单)
创建菜单的方式有两种: 通过xml配置 和 代码生成
菜单的样式 4.0 后有变化,如果要回到之前2.x的样式可以配置activity的属性 android:theme="@android:style/Theme"
4.0后的菜单不能设置icon , 可以通过实例中的方法设置
option menu 只需创建 和 监听事件, context在创建之前需要在某一个view上注册
MainActivity.java
package com.example.menu_actionbar;
import java.lang.reflect.Method;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.app.ListActivity;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class MainActivity extends ListActivity {
private String[] colors = {"red", "green", "blue"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, colors);
setListAdapter(adapter);
//ContextMenu 右键菜单效果, 使用前先注册到对应的View, 一般在ListView上使用
registerForContextMenu(getListView());
}
//Context Menu, 创建 和 事件响应
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.main, menu);
setIconEnable(menu, true);
super.onCreateContextMenu(menu, v, menuInfo);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
//info知道是点击的哪个listview
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId()) {
case R.id.menu_settings:
Toast.makeText(this, "click setting item, "+info.position, Toast.LENGTH_SHORT).show();
break;
case R.id.menu_call:
Toast.makeText(this, "click call item"+info.position, Toast.LENGTH_SHORT).show();
break;
case R.id.menu_edit:
Toast.makeText(this, "click edit item"+info.position, Toast.LENGTH_SHORT).show();
break;
default:
break;
}
return super.onContextItemSelected(item);
}
//OptionsMenu
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//方式一: 通过xml配置menu
getMenuInflater().inflate(R.menu.main, menu);
setIconEnable(menu, true);
//方式二: 代码添加
//menu.add(0, 1, Menu.NONE, "Send");
//SubMenu subMenu = menu.addSubMenu(0, 2, Menu.NONE, "Edit");
//subMenu.add(1, 21, 1, "Edit1");
//subMenu.add(1, 22, 2, "Edit2");
//add 方法的参数
//groupId,组别,用来划分itemid的。一般为Menu.NONE
//itemId,ID。是menu识别编号,供识别menu用的,很重要
//order,顺序。这个参数的大小决定菜单选项出现的先后顺序。顺序按照参数由小到大
//title,显示文本
return true;
}
//OptionsMenu item被选中的触发事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
return super.onOptionsItemSelected(item);
}
// 4.0 后不能设置icon的原因是 MenuBuilder中默认的setOptionalIconsVisible被设置false
private void setIconEnable(Menu menu, boolean enable)
{
try
{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
//MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
m.invoke(menu, enable);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
res/menu/main.xml 菜单配置
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_settings"
android:orderInCategory="100"
android:showAsAction="never"
android:title="@string/action_settings"
android:icon="@android:drawable/ic_menu_set_as" />
<item
android:menuCategory="container"
android:id="@+id/menu_edit"
android:title="Edit"
android:icon="@android:drawable/ic_menu_edit">
<menu>
<item android:title="Edit title" android:visible="true" android:enabled="true"/>
<item android:title="Edit text" android:visible="true" android:enabled="true"/>
</menu>
</item>
<item
android:id="@+id/menu_call"
android:title="Call"
android:icon="@android:drawable/ic_menu_call"/>
</menu>