android menu学习笔记
android的菜单有两种,第一种是设备自带的menu菜单,第二种是长按某个组件的时候弹出的上下文菜单(类似于右键菜单)
一、手机菜单Menu
要手动创建Menu,不需要像其他组件一样去画界面,
只需要重写public boolean onCreateOptionsMenu(Menu menu)方法
如果要监听 则需要重写public boolean onOptionsItemSelected(MenuItem item)
android默认规定menu菜单不能超过6个,否则的话就会在第六个按钮显示更多。
直接上代码
public boolean onCreateOptionsMenu(Menu menu){
SubMenu engryMenu = menu.addSubMenu("愤怒"); // 设置菜单图标 engryMenu.setIcon(R.drawable.angrybirds); // 设置菜单打开后选项的图标 // hobbyMenu.setHeaderIcon(icon) // 设置菜单打开后选项的标题 engryMenu.setHeaderTitle("愤怒的小鸟"); // groupId,itemId,orderId engryMenu.add(0, bird1, 1, "bird1"); engryMenu.add(0, bird2, 2, "bird1"); SubMenu earlyMenu = menu.addSubMenu(0, 5, 1, "喜悦"); earlyMenu.setIcon(R.drawable.earlybird); earlyMenu.setHeaderTitle("喜悦的小鸟"); earlyMenu.add(0, bird3, 1, "bird3"); earlyMenu.add(0, bird4, 2, "bird4");
}
监听事件
private final int bird1 = 1; private final int bird2 = 2; private final int bird3 = 3; private final int bird4 = 4; @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub int id = item.getItemId(); switch (id) { case bird1: Toast.makeText(getApplication(), "bird1", 1).show(); break; case bird2: break; case bird3: break; case bird4: break; case 5: Toast.makeText(getApplication(), "喜悦主菜单被选中", 1).show(); break; default: break; } return super.onOptionsItemSelected(item); }
menu还提供了XML方式的静态方式
我们在res目录下创建一个menu类型的XML
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/staticGroup"> <item android:id="@+id/staticMenu" android:title="menu1"></item> <item android:title="menu1"></item> </group> </menu>
@Override public boolean onCreateOptionsMenu(Menu menu) { // TODO Auto-generated method stub MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.static_menu, menu); return super.onCreateOptionsMenu(menu); }
二、上下文菜单(右键菜单)
上下文菜单是在我们为某个组件注册了registerForContextMenu方法之后,当我们长按该组件时候
触发弹出上下文菜单(右键菜单是不是更形象?O(∩_∩)O)
与上述提到的Menu菜单类似,上下文菜单同样也是通过一个方法(onCreateContextMenu)创建,一个方法来监听(onContextItemSelected)所不用的是他还需要registerForContextMenu某个组件
1 @Override 2 public void onCreate(Bundle savedInstanceState) { 3 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.context_menu); 6 mTvMenu = (TextView) findViewById(R.id.tv_menu); 7 // 注册 上下文菜单 8 registerForContextMenu(mTvMenu); 9 10 } 11 12 @Override 13 public void onCreateContextMenu(ContextMenu menu, View v, 14 ContextMenuInfo menuInfo) { 15 // TODO Auto-generated method stub 16 super.onCreateContextMenu(menu, v, menuInfo); 17 menu.setHeaderTitle("上下文菜单"); 18 menu.add("发送"); 19 menu.add("保存"); 20 menu.add("分享"); 21 menu.add("复制"); 22 23 } 24 25 @Override 26 public boolean onContextItemSelected(MenuItem item) { 27 // TODO Auto-generated method stub 28 return super.onContextItemSelected(item); 29 }
如果你对上下文菜单的机制有更进一步了解,可以移步这里http://www.cnblogs.com/codingmyworld/archive/2011/08/27/2155521.html
对静态XML配置的话,则移步这里
http://www.cnblogs.com/codingmyworld/archive/2011/08/28/2155594.html
三、动态生成菜单
有时候我们需要根据实际情况来生成不同的menu,比如现在有两个按钮menu1和menu2.
我希望点击menu1的时候menu菜单只有menu1,而当点击了menu2的时候menu只会有menu2
要实现这个功能,我们必须要了解另外一个非常重要的方法onPrepareOptionsMenu()
这个方法跟onCreateOptionsMenu的区别在于
onCreateOptionsMenu只会在第一次出发menu的时候才会调用
而onPrepareOptionsMenu是每次点击menu菜单的时候都会触发
为了避免onPrepareOptionsMenu中创建的menu跟onCreateOptionsMenu中创建的menu冲突
可以在onPrepareOptionsMenu的最上头加上一句menu.clear。
不多说直接上代码
1 private Button bt_menu1; 2 private Button bt_menu2; 3 private int choose=0; 4 5 @Override 6 public void onCreate(Bundle savedInstanceState) { 7 8 super.onCreate(savedInstanceState); 9 10 setContentView(R.layout.menu); 11 12 bt_menu1 = (Button) findViewById(R.id.bt_menu1); 13 bt_menu2 = (Button) findViewById(R.id.bt_menu2); 14 15 bt_menu1.setOnClickListener(new View.OnClickListener() { 16 17 @Override 18 public void onClick(View v) { 19 choose=0; 20 openOptionsMenu(); 21 22 } 23 }); 24 bt_menu2.setOnClickListener(new View.OnClickListener() { 25 26 @Override 27 public void onClick(View v) { 28 choose=1; 29 openOptionsMenu(); 30 31 } 32 }); 33 34 } 35 @Override 36 public boolean onPrepareOptionsMenu(Menu menu) { 37 // TODO Auto-generated method stub 38 39 // 清空 否则onCreateOptionsMenu()中的会叠加 40 menu.clear(); 41 // 假设我们有两个按钮都 42 if(choose==0){ 43 menu.add("menu1"); 44 45 }else{ 46 menu.add("menu2"); 47 48 } 49 50 return super.onPrepareOptionsMenu(menu); 51 52 }
在按钮中如何触发menu事件,可以通过openOptionsMenu这个方法来完成
或则可以通过模拟按钮来实现
String keyCommand = "input keyevent " + KeyEvent.KEYCODE_MENU; Runtime runtime = Runtime.getRuntime(); Process proc = runtime.exec(keyCommand);