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);  
原文地址:https://www.cnblogs.com/draem0507/p/3073597.html