Android 的 onCreateOptionsMenu() 创建菜单 Menu 详解

ITeye-博客 8.7K 4

android一共有三种形式的菜单:
1.选项菜单(optinosMenu)
2.上下文菜单(ContextMenu)
3.子菜单(subMenu)

其中最常用的就是选项菜单(optionsMenu), 该菜单在点击 menu 按键 后会在对应的 Activity 显示出来。

1.Activity菜单机制 (与dialog类似)

Activity有一套机制来实现对菜单的管理,方法如下:

  1. public class MainActivity extends Activity {  
  2.   
  3.     @Override  
  4.     protected void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.activity_main);  
  7.     }  
  8.   
  9.     @Override  
  10.     public boolean onCreateOptionsMenu(Menu menu) {  
  11.         /** 
  12.          * 此方法用于初始化菜单,其中menu参数就是即将要显示的Menu实例。 返回true则显示该menu,false 则不显示; 
  13.          * (只会在第一次初始化菜单时调用) Inflate the menu; this adds items to the action bar 
  14.          * if it is present. 
  15.          */  
  16.         getMenuInflater().inflate(R.menu.main, menu);  
  17.         return true;  
  18.     }  
  19.   
  20.     @Override  
  21.     public boolean onPrepareOptionsMenu(Menu menu) {  
  22.         /** 
  23.          * 在onCreateOptionsMenu执行后,菜单被显示前调用;如果菜单已经被创建,则在菜单显示前被调用。 同样的, 
  24.          * 返回true则显示该menu,false 则不显示; (可以通过此方法动态的改变菜单的状态,比如加载不同的菜单等) TODO 
  25.          * Auto-generated method stub 
  26.          */  
  27.         return super.onPrepareOptionsMenu(menu);  
  28.     }  
  29.   
  30.     @Override  
  31.     public void onOptionsMenuClosed(Menu menu) {  
  32.         /** 
  33.          * 每次菜单被关闭时调用. (菜单被关闭有三种情形,menu按钮被再次点击、back按钮被点击或者用户选择了某一个菜单项) TODO 
  34.          * Auto-generated method stub 
  35.          */  
  36.         super.onOptionsMenuClosed(menu);  
  37.     }  
  38.   
  39.     @Override  
  40.     public boolean onOptionsItemSelected(MenuItem item) {  
  41.         /** 
  42.          * 菜单项被点击时调用,也就是菜单项的监听方法。  
  43.          * 通过这几个方法,可以得知,对于Activity,同一时间只能显示和监听一个Menu 对象。 TODO Auto-generated 
  44.          * method stub 
  45.          */  
  46.         return super.onOptionsItemSelected(item);  
  47.     }  
  48.   
  49. }  

2. 添加菜单:

可以在onCreateOptionsMenu或者 onPrepareOptionsMenu方法中来添加菜单

2.1代码添加:

  1. menu.add((int groupId, int itemId, int order, charsequence title) .setIcon(drawable ID)  

add()方法的四个参数,依次是:

1、组别,如果不分组的话就写Menu.NONE,

2、Id,这个很重要,Android根据这个Id来确定不同的菜单

3、顺序,哪个菜单项在前面由这个参数的大小决定

4、文本,菜单项的显示文本

add()方法返回的是MenuItem对象,调用其setIcon()方法,为相应MenuItem设置Icon

示例:

  1. public boolean onCreateOptionsMenu(Menu menu) {   
  2.     super.onCreateOptionsMenu(menu);   
  3.     menu.add(Menu.NONE,  Menu.First+1 , 0"设置").setIcon(R.drawable.setting);   
  4.     return true;   
  5. }   

2.2布局文件添加:

  1. getMenuInflater().inflate(R.menu.options_menu, menu);   

调用Activity的getMenuInflater()得到一个MenuInflater,使用inflate方法来把布局文件中的定义的菜单 加载给 第二个参数所对应的menu对象

示例:

  1. @Override   
  2. public boolean onCreateOptionsMenu(Menu menu) {   
  3.         super.onCreateOptionsMenu(menu);   
  4.         getMenuInflater().inflate( R.menu.options_menu , menu);   
  5.         return true;   
  6. }   

布局文件:

在res目录下建立一个menu文件夹,并创建布局文件: options_menu.xml

  1. <?xml version="1.0" encoding="utf-8"?>   
  2. <menu xmlns:android="http://schemas.android.com/apk/res/android">   
  3. <item android:id=" @+id/menu_setting " android:title="设置" android:icon="@drawable/setting"></item>   
  4. </menu>   

3.菜单项监听:

只要菜单中的菜单项被点击,都会触发onOptionsItemSelected(MenuItem item) item参数即为被点击的菜单项,那么需要在此方法内判断哪个Item被点击了,从而实现不同的操作。

对于两种不同的添加菜单方法,判断的方法有一点区别,但本质是一样的。

3.1代码添加菜单的判断方法

  1. @Override   
  2. public boolean onOptionsItemSelected(MenuItem item) {   
  3.     super.onOptionsItemSelected(item);   
  4.     switch(item.getItemId()) //得到被点击的item的itemId   
  5.     {   
  6.     case  Menu.First+1 :  //对应的ID就是在add方法中所设定的Id   
  7.         break;   
  8.     case  Menu.First+2 :   
  9.         break;   
  10.     }   
  11.     return true;   
  12. }   

3.2布局文件添加菜单的判断方法:

  1. @Override   
  2. public boolean onOptionsItemSelected(MenuItem item) {   
  3.     super.onOptionsItemSelected(item);   
  4.     switch(item.getItemId()) //得到被点击的item的itemId   
  5.     {   
  6.     case  R.id.menu_setting : //这里的Id就是布局文件中定义的Id,在用R.id.XXX的方法获取出来   
  7.         break;   
  8.     case R.id.menu_info:   
  9.         break;   
  10.     }   
  11.     return true;   
  12. }  

4、菜单的简易应用

下面的例子演示了通过菜单项改变 TextView 的颜色

  1. public class MainActivity extends AppCompatActivity {  
  2.   
  3.     //1.定义不同颜色的菜单项的标识:  
  4.     final private int RED = 110;  
  5.     final private int GREEN = 111;  
  6.     final private int BLUE = 112;  
  7.     final private int YELLOW = 113;  
  8.     final private int GRAY= 114;  
  9.     final private int CYAN= 115;  
  10.     final private int BLACK= 116;  
  11.   
  12.     private TextView tv_test;  
  13.   
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.activity_main);  
  18.         tv_test = (TextView) findViewById(R.id.tv_test);  
  19.     }  
  20.   
  21.     @Override  
  22.     public boolean onCreateOptionsMenu(Menu menu) {  
  23.         // Inflate the menu; this adds items to the action bar if it is present.  
  24.         menu.add(1, RED, 0"红色");  
  25.         menu.add(1, GREEN, 0"绿色");  
  26.         menu.add(1, BLUE, 0"蓝色");  
  27.         menu.add(1, YELLOW, 0"黄色");  
  28.         menu.add(1, GRAY, 0"灰色");  
  29.         menu.add(1, CYAN, 0"蓝绿色");  
  30.         menu.add(1, BLACK, 0"黑色");  
  31.         return true;  
  32.     }  
  33.   
  34.     @Override  
  35.     public boolean onOptionsItemSelected(MenuItem item) {  
  36.         // Handle action bar item clicks here. The action bar will  
  37.         // automatically handle clicks on the Home/Up button, so long  
  38.         // as you specify a parent activity in AndroidManifest.xml.  
  39.         int id = item.getItemId();  
  40.         switch (id){  
  41.             case RED:  
  42.                 tv_test.setTextColor(Color.RED);  
  43.                 break;  
  44.             case GREEN:  
  45.                 tv_test.setTextColor(Color.GREEN);  
  46.                 break;  
  47.             case BLUE:  
  48.                 tv_test.setTextColor(Color.BLUE);  
  49.                 break;  
  50.             case YELLOW:  
  51.                 tv_test.setTextColor(Color.YELLOW);  
  52.                 break;  
  53.             case GRAY:  
  54.                 tv_test.setTextColor(Color.GRAY);  
  55.                 break;  
  56.             case CYAN:  
  57.                 tv_test.setTextColor(Color.CYAN);  
  58.                 break;  
  59.             case BLACK:  
  60.                 tv_test.setTextColor(Color.BLACK);  
  61.                 break;  
  62.         }  
  63.         return super.onOptionsItemSelected(item);  
  64.     }  
  65. }  

运行效果

Android 的 onCreateOptionsMenu() 创建菜单 Menu 详解

发表评论 取消回复
表情 图片 链接 代码

  1. 脉冲
    脉冲 Lv 2

    仰视大佬,可以用于Hbuilder软件吗?

    • mengkun
      mengkun 站长

      @脉冲这和 Hbuilder 完全是两码事 [晕]

  2. 夏木
    夏木 Lv 1

    音乐系统貌似挂了, 网易好像封堵了接口

    • mengkun
      mengkun 站长

      @夏木新版已修复(下载地址还是原来的那个)

分享