Android学习之Menu

1.普通的Menu

在Activity中覆盖onCreateOptionsMenu(Menu menu)方法,该方法负责生产menu,它是一个回调函数,即当按下手机设备上的menubutton时Android系统才会生产菜单。

public boolean onCreateOptionsMenu(Menu menu) {
  //menu.add(arg0, arg1, arg2, arg3)给button加入一项菜单
  //第一个參数:分组的id,假设不用分组则设为0
  //第二个參数:menu中每一项的id,这个id应该是唯一的
  //第三个參数:排序的信息,依据这个字段的大小,menu对当中的项进行排序显示:小的排在前面
  //第四个參数:menu项的显示信息
  menu.add(0, MENU_ITEM_1, 0, "APPLE");
  menu.add(0, MENU_ITEM_2, 0, "ORANGE");
  return super.onCreateOptionsMenu(menu);
 }

假设要加入单击事件,则要覆盖onOptionsItemSelected(MenuItem item)方法。

public boolean onOptionsItemSelected(MenuItem item) {
  //通过id推断传来的item,这个id通过item.getItemId()得到
  switch(item.getItemId()){
  case MENU_ITEM_1:
   t = Toast.makeText(this, "you choose the apple", Toast.LENGTH_SHORT);
   t.show();
   break;
  case MENU_ITEM_2:
   t = Toast.makeText(this, "you choose the orange", Toast.LENGTH_SHORT);
   t.show();
   break;
  }
  return true;
 }

2.子菜单(SubMenu)

public boolean onCreateOptionsMenu(Menu menu) {
  menu.add(0, MENU_ITEM_1, 1, "APPLE");
  menu.add(0, MENU_ITEM_2, 2, "ORANGE");

  //为menu创建SubMenu对象
  SubMenu subMenu = menu.addSubMenu(0, MENU_ITEM_3, 3, "BANANA");

  //向subMenu中加入选项
  subMenu.add(0, 31, 31, "BIG BANANA");
  subMenu.add(0, 32, 32, "SMALL BANANA");
  return super.onCreateOptionsMenu(menu);
 }

3.上下文菜单(ContextMenu)——长按特定View后弹出的菜单

不论什么视图都能够注冊ContextMenu,但最常见的是用于列表视图ListView的item。

在onCreate方法中为View注冊ContextMenu。

protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.contextmenu);
  btn1 = (Button)findViewById(R.id.btn1);
  btn2 = (Button)findViewById(R.id.btn2);
  //为Button注冊ContextMenu
  registerForContextMenu(btn1);
  registerForContextMenu(btn2);
 }

覆盖Activity的onCreateContenxtMenu()方法,调用Menu的add方法加入菜单项(MenuItem)

public void onCreateContextMenu(ContextMenu menu, View v,
   ContextMenuInfo menuInfo) {
   if(v==btn1){

   //设置菜单标题
   menu.setHeaderTitle("this is the frist");

   //加入菜单
   menu.add(0, 200, 0, "context menu 1");
   menu.add(0, 201, 0, "context menu 2");
  }
  if(v==btn2){

   //设置菜单标题
   menu.setHeaderTitle("this is the second");

   //加入菜单
   menu.add(0, 300, 0, "context menu 3");
   menu.add(0, 301, 0, "context menu 4");
  }
  super.onCreateContextMenu(menu, v, menuInfo);
 }

4.动态Menu

onPrepareOptionsMenu()在菜单列表即将显示出来时决定哪些菜单要显示哪些不显示,当然也能够做一些其它工作。

public boolean onPrepareOptionsMenu(Menu menu) {        
 String currentText = textview.getText().toString();        
 if("M".equals(currentText)){            
  //先清掉菜单 
  menu.clear();    
  //能够通过点击这个菜单项来改变textview的值,这样(变成N)就能够測试了
  MenuItem item = menu.add(0, 400, 401, "to N");
  //android自带的图标
  item.setIcon(android.R.drawable.alert_dark_frame);       
 }        
 if("N".equals(currentText)){            
  //先清掉菜单 
  menu.clear();   
  //能够通过点击这个菜单项来改变textview的值,这样(变成M)就能够測试了
  MenuItem item = menu.add(0, 401, 402, "to M");
  item.setIcon(android.R.drawable.alert_light_frame);        
 }      
 //如今共同拥有两个菜单子项
 menu.add(0, 402, 403, "Now is " + currentText);        
 return super.onPrepareOptionsMenu(menu);   
}

5.用XML文件方式创建Menu

在res/文件夹下建一个文件夹,名为menu,以下建一个xml文件,名为menu_xml_file.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/grout_main">
    <item android:id="@+id/menu_1"
                android:title="This 1"/>
    <item android:id="@+id/menu_2" 
            android:title="This 2" /> 
</group>
</menu>

在Activity中覆盖onCreateOptionsMenu(Menu menu)方法

public boolean onCreateOptionsMenu(Menu menu) {
        //MenuInflater类用来实例化菜单XML文件成菜单对象

        //获取当前菜单
        MenuInflater inflater = getMenuInflater();
        //inflate(int menuRes, Menu menu)填充菜单

        //从一个指定的xml资源去填充菜单,假设有错误会抛掷InflateException

        //menuRes 要载入XML布局文件里的资源ID

        //menu 要填充的菜单,这些项目和子菜单就被加入到要填充菜单中

        inflater.inflate(R.menu.menu_xml_file, menu);
        return true;
    }

其它都和在Activity中创建Menu同样。

 

小知识:单击MENUbutton时,在Activity中回调的函数可能有两个:

第一个是onOptionsItemSelected(),这个函数仅仅在第一次单击当前应用中的MENUbutton时回调,以后再不回调。

第二个是onPrepareOptionsMenu(),这个函数在每次单击MENUbutton后显示MENU时被系统回调,每次MENU显示前都会回调此函数。我们一般依据条件改变MENU显示的逻辑都放在这个函数里面。

转自:http://zhouyuting714.blog.163.com/blog/static/1811643182011327101931489/

原文地址:https://www.cnblogs.com/gcczhongduan/p/3985622.html