Android中的Menu

来源:互联网 发布:恒生指数看盘软件 编辑:程序博客网 时间:2024/05/24 02:33

上下文菜单(通过在某元素上长按,来呼出菜单)
选项菜单(通过按手机上的菜单按钮,来呼出菜单) 

重写 onCreateContextMenu 用以创建上下文菜单
重写 onContextItemSelected 用以响应上下文菜单

重写 onCreateOptionsMenu 用以创建选项菜单
重写 onOptionsItemSelected 用以响应选项菜单

当每次Menu显示时,会调用方法onPrepareOptionsMenu,也可以在菜单每次被调用时,对菜单中的项重新生成,通过重载onPrepareOptionsMenu来实现,由于每次调用时都要重新生成,对于那些不经常变化的菜单,效率就会比较低。

调用Menu.addSubMenu()方法,为某个菜单项添加子菜单

public void onCreateContextMenu(ContextMenu menu, View v,            ContextMenuInfo menuInfo) {        super.onCreateContextMenu(menu, v, menuInfo);        // 创建 R.id.txt1 的上下文菜单        if (v == (TextView) this.findViewById(R.id.txt1)) {            menu.setHeaderIcon(R.drawable.icon01); //设置菜单的图标            menu.setHeaderTitle("我是菜单"); //设置菜单的标题                       // 用 ContextMenu.add() 来增加菜单项,返回值为 MenuItem            // 第一个参数:组ID            // 第二个参数:菜单项ID            即onContextItemSelected(MenuItem item)中item.getItemId            // 第三个参数:顺序号            // 第四个参数:菜单项上显示的内容            menu.add(1, 0, 0, "菜单1");                       // MenuItem - 新增菜单项后的返回类型,针对菜单项的其他设置在此对象上操作            menu.add(1, 1, 1, "菜单2").setCheckable(true);                   }        // 创建 R.id.txt2 的上下文菜单(多级上下文菜单)        else if (v == (TextView) this.findViewById(R.id.txt2)) {                       // ContextMenu.addSubMenu("菜单名称") - 用来添加子菜单。子菜单其实就是一个特殊的菜单            SubMenu sub = menu.addSubMenu("父菜单1");            sub.setIcon(R.drawable.icon01);            sub.add(0, 0, 0, "菜单1");            sub.add(0, 1, 1, "菜单2");            sub.setGroupCheckable(1, true, true);            SubMenu sub2 = menu.addSubMenu("父菜单2");            sub2.setIcon(R.drawable.icon01);            sub2.add(1, 0, 0, "菜单3");            sub2.add(1, 1, 1, "菜单4");            sub2.setGroupCheckable(1, true, false);                   }    }

 

Example:

自己运行加修改的例子

package com.example.firstandroid;import android.app.Activity;import android.os.Bundle;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.TextView;import android.widget.Toast;public class MainActivity extends Activity {private final int MENU1 = 1;private final int MENU2 = 2;private final int MENU3 = 3;private final int MENU4 = 4;private final int MENU5 = 5;private final int MENU6 = 6;private final int MENU7 = 7;private final int MENU8 = 8;private final int MENU9 = 9;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/* * TextView textView = new TextView(this); * textView.setText("Hello Android World!"); */// setContentView(textView);/* * TextView v = (TextView)findViewById(R.id.txt); String text = * getString(R.string.androidTxt); v.setText(text); */// ((LinearLayout)findViewById(R.id.layout)).addView(textView);TextView v1 = (TextView) findViewById(R.id.txt1);TextView v2 = (TextView) findViewById(R.id.txt2);TextView v3 = (TextView) findViewById(R.id.txt3);registerForContextMenu(v1);registerForContextMenu(v2);registerForContextMenu(v3);}@Overridepublic boolean onContextItemSelected(MenuItem item) {switch (item.getItemId()) {case 0:case 1:case 2: case 3: case 4:case 5:        case 6:case 7: case 8: case 9:        Toast.makeText(this, "你选择的是  "+item.getTitle()+ " 菜单", Toast.LENGTH_SHORT).show();              break;          default://对没有处理的事件,交给父类来处理              return super.onContextItemSelected(item);  }return super.onContextItemSelected(item);}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {// TODO Auto-generated method stubsuper.onCreateContextMenu(menu, v, menuInfo);menu.setHeaderIcon(R.drawable.ic_action_search);// 父菜单图标switch (v.getId()) {case R.id.txt1:menu.setHeaderTitle("我是菜单");menu.add(0, MENU1, 0, "菜单1");menu.add(0, MENU2, 1, "菜单2");menu.add(0, MENU3, 2, "菜单3").setCheckable(true);break;case R.id.txt2:SubMenu s1 = menu.addSubMenu("父菜单1");s1.setIcon(R.drawable.ic_action_search);//貌似没啥作用s1.add(0, 5, 0, "菜单1");s1.add(0, 6, 1, "菜单2");s1.add(0, 7, 2, "菜单3");SubMenu s2 = menu.addSubMenu("父菜单2");s2.setHeaderIcon(R.drawable.setting);s2.add(1, 8, 0, "菜单3");s2.add(1, 9, 1, "菜单4");s2.add(1, 10, 2, "菜单5");SubMenu s3 = menu.addSubMenu("父菜单3"); //会显示,但没有子菜单break;case R.id.txt3://1、通过xml文件来添加菜单//getMenuInflater().inflate(R.menu.activity_main, menu);menu.setHeaderTitle("联系人操作"); menu.add(1,MENU1,1,"呼叫").setIcon(R.drawable.setting);           menu.add(1,MENU2,2, "清除记录").setIcon(R.drawable.setting);   menu.add(1,MENU3,3,"切换到Q信").setIcon(R.drawable.setting).setEnabled(false);   //menu.add(2,MENU_Q,3,"切换到Q信").setIcon(R.drawable.setting).setEnabled(false);    menu.add(2,MENU4,4,"加入黑名单").setIcon(R.drawable.setting);   menu.add(2,MENU5,5,"加入白名单").setIcon(R.drawable.setting); SubMenu subMenu = menu.addSubMenu(2, MENU6, 6, "系统设置").setIcon(R.drawable.setting);   subMenu.add(1, MENU7, 2, "网络设置");   subMenu.add(1, MENU8, 3, "高级设置");   subMenu.add(1, MENU9, 4, "安全设置");   }}//二、选项菜单private static final int MENU_CALL = Menu.FIRST;  //1private static final int MENU_DELETE = Menu.FIRST+1;private static final int MENU_Q = Menu.FIRST+2;private static final int MENU_BLACK_LIST = Menu.FIRST+3;private static final int MENU_WHITE_LIST = Menu.FIRST+4; /** 只有当Menu菜单首次被显示时会调用此方法 */@Overridepublic boolean onCreateOptionsMenu(Menu menu) {super.onCreateOptionsMenu(menu);  //1、通过xml文件来添加菜单//getMenuInflater().inflate(R.menu.activity_main, menu);//2、通过手动添加来配置上下文菜单选项  menu.add(1,MENU_CALL,1,"呼叫").setIcon(R.drawable.setting);           menu.add(1,MENU_DELETE,2, "清除记录").setIcon(R.drawable.setting);   menu.add(2,MENU_Q,3,"切换到Q信").setIcon(R.drawable.setting).setEnabled(false);   menu.add(2,MENU_BLACK_LIST,4,"加入黑名单").setIcon(R.drawable.setting);   menu.add(2,MENU_WHITE_LIST,5,"加入白名单").setIcon(R.drawable.setting);    SubMenu subMenu = menu.addSubMenu(2, MENU6, 6, "系统设置").setIcon(R.drawable.setting);   subMenu.add(1, MENU7, 2, "网络设置");   subMenu.add(1, MENU8, 3, "高级设置");   subMenu.add(1, MENU9, 4, "安全设置");     // 如果希望显示菜单,请返回true  return true;}@Overridepublic boolean onMenuItemSelected(int featureId, MenuItem item) {switch (item.getItemId()) {  //XML方式         /*case R.id.id_call:               Toast.makeText(this, "你选择的是 呼叫  菜单", Toast.LENGTH_LONG).show();               break;           case R.id.id_delete:           case R.id.id_himsg:           case R.id.id_black:          case R.id.id_white:               Toast.makeText(getApplicationContext(), "你选择的是  "+item.getTitle()+ " 菜单", Toast.LENGTH_SHORT).show();               break; */     //addMenu方式,使用case 1: ...case 1:case 2:case 3: case 4:case 5:case 6:case 7:case 8: case 9:Toast.makeText(getApplicationContext(), "你选择的是  "+item.getTitle()+ " 菜单", Toast.LENGTH_SHORT).show();  break;         default://对没有处理的事件,交给父类来处理               return super.onMenuItemSelected(featureId, item);           }           //返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了  return super.onMenuItemSelected(featureId, item);} /** 当每次Menu显示时,会调用此方法*/@Overridepublic boolean onPrepareOptionsMenu(Menu menu) {// TODO Auto-generated method stubreturn super.onPrepareOptionsMenu(menu);}}
 

选项菜单:


其中的系统设置:


 

上下文菜单:

第一个:


第二个:



第三个:


其中的系统设置:


 

That's all ! 哈哈

 

其中例子参考学习:

http://liuzhichao.com/p/402.html#more-402

http://blog.csdn.net/tenggangren/article/details/7996193

http://www.cnblogs.com/linjiqin/archive/2011/03/08/1977636.html