菜单Menu、选项菜单OptionsMenu、上下文菜单ContextMenu、子菜单SubMenu


菜单Menu

  在Android中,所有的菜单创建方法都由Activity类本身提供。Android系统中一共有3种菜单:选项菜单(ptionsMenu)、上下文菜单(ContextMenu)和子菜单(SubMenu),下面分别介绍。

一、选项菜单(OptionsMenu)

  选项菜单是一种最常用也是最基本的菜单,通过覆写android.app.Activity为在几个方法即可实现。这些方法有:

(1)设置多个菜单项(MenuItem),如果返回true,表示显示菜单,反之则不显示:

Public booleanonCreateOptionsMenu(Menu menu)

(2)判断菜单项的操作:public boolean onOptionsItemSelected(MenuItemitem)

(3)当菜单关闭时触发此操作:public void onOptionsMenuClose(Menu menu)

(4)在菜单显示前触发此操作,如果返回true,则继续调用onCreateOptionsMenu()方法,反之不调用:public BooleanonPrepareOptionsMenu(Menu menu)

例 1 程序运行效果截图

菜单Menu、选项菜单OptionsMenu、上下文菜单ContextMenu、子菜单SubMenu_第1张图片

实现过程:

1. 编写main.xml布局管理器

xml version="1.0" encoding="utf-8"?>  
<LinearLayout   
    xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:background="#00ff00">  
    <TextView   
        android:id="@+id/textview"  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="按下键盘上的 Menu 键将会出现选择菜单,快试试吧..."/>  
LinearLayout>

2. 编写MainActivity程序

import android.app.Activity;  
import android.os.Bundle;  
import android.view.Menu;  
import android.view.MenuItem;  
import android.widget.Toast;  
  
public class MainActivity extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        super.setContentView(R.layout.main);  
    }  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu){  
        //super.getMenuInflater().inflate(R.menu.main_menu, menu);  
        menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除")  
        .setIcon(android.R.drawable.ic_menu_delete);  
        menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存")  
        .setIcon(android.R.drawable.ic_menu_save);  
        menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助")  
        .setIcon(android.R.drawable.ic_menu_help);  
        menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加")  
        .setIcon(android.R.drawable.ic_menu_add);  
        menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细")  
        .setIcon(android.R.drawable.ic_menu_info_details);  
        menu.add(Menu.NONE, Menu.FIRST + 6, 7, "发送")  
        .setIcon(android.R.drawable.ic_menu_send);  
        menu.add(Menu.NONE, Menu.FIRST + 7, 3, "编辑")  
        .setIcon(android.R.drawable.ic_menu_edit);  
        return true;  
    }  
    @Override  
    public boolean onOptionsItemSelected(MenuItem item){  
        switch(item.getItemId()){  
        case Menu.FIRST + 1:  
            Toast.makeText(this, "你选择了“添加菜单”项", Toast.LENGTH_LONG).show();  
        break;  
        case Menu.FIRST + 2:  
            Toast.makeText(this, "你选择了“保存菜单”项", Toast.LENGTH_LONG).show();  
        break;  
        case Menu.FIRST + 3:  
            Toast.makeText(this, "你选择了“编辑菜单”项", Toast.LENGTH_LONG).show();  
        break;  
        case Menu.FIRST + 4:  
            Toast.makeText(this, "你选择了“详细菜单”项", Toast.LENGTH_LONG).show();  
        break;  
        case Menu.FIRST + 5:  
            Toast.makeText(this, "你选择了“删除菜单”项", Toast.LENGTH_LONG).show();  
        break;  
        case Menu.FIRST + 6:  
            Toast.makeText(this, "你选择了“发送菜单”项", Toast.LENGTH_LONG).show();  
        break;  
        case Menu.FIRST + 7:  
            Toast.makeText(this, "你选择了“帮助菜单”项", Toast.LENGTH_LONG).show();  
        break;  
        }  
        return false;  
    }  
    @Override  
    public void onOptionsMenuClosed(Menu menu){  
        Toast.makeText(this, "选择菜单关闭了", Toast.LENGTH_LONG).show();  
    }  
    @Override  
    public boolean onPrepareOptionsMenu(Menu menu){  
        Toast.makeText(this, "在菜单显示(onCreateOptionsMenu())之前系统会调用此操作,可以" +  
                "在此操作中完成一些处理操作。)",  
                Toast.LENGTH_LONG).show();  
        return true;  
    }  
}  

  此程序中直接通过onCreateOptionsmenu()方法在菜单中增加了多个菜单项,在应用中也可以通过配置资源文件的方式设置所有的菜单项,可在res文件夹中建立单项的配置文件。建立res\menu\menu.xml文件配置菜单项:

<menu xmlns:android="http://schemas.android.com/apk/res/android">  
    <item   
        android:id="@+id/item_1"  
        android:title="添加"  
        android:icon="@android:drawable/ic_menu_add"/>  
    <item   
        android:id="@+id/item_2"  
        android:title="保存"  
        android:icon="@android:drawable/ic_menu_save"/>  
    <item   
        android:id="@+id/item_3"  
        android:title="编辑"  
        android:icon="@android:drawable/ic_menu_edit"/>  
    <item   
        android:id="@+id/item_4"  
        android:title="详细"  
        android:icon="@android:drawable/ic_menu_info_details"/>  
    <item   
        android:id="@+id/item_5"  
        android:title="删除"  
        android:icon="@android:drawable/ic_menu_delete"/>  
    <item   
        android:id="@+id/item_6"  
        android:title="帮助"  
        android:icon="@android:drawable/ic_menu_send"/>  
    <item   
        android:id="@+id/item_7"  
        android:title="发送"  
        android:icon="@android:drawable/ic_menu_help"/>  
menu>

  在此配置文件中通过元素定义了多个菜单项,要从此配置文件中取出数据,就要修改onCreateOptionsMenu(),利用super.getMenuInfalter().inflater()方法加载menu.xml配置文件中的菜单信息,修改后的代码如下:

Public Boolean onCreateOptionsMenu(Menu menu){   //显示菜单  
    super.getMenuInflater().inflate(R.menu.menu, menu);   //填充菜单项  
    return true;  
} 

二、上下文菜单ContextMenu

  上下文菜单类似于Windows中的右键菜单的操作形式,在android中,在一个列表显示(ListView)操作时,用户可以通过长按操作打开某些操作的菜单,这种菜单就是上下文菜单。要进行上下文菜单的操作,需要在Activity程序中覆写如下方法:

(1) public   void  onCreateContextMenu(ContextMenu menu, View view,

           ContextMenu.ContextMenuInfo menuInfo):在此方法中可以设置要显示的菜单项;

(2)public boolean onContextItemSelected(MenuItemitem):当某个菜单项被选中时,触发此操作;

(3)public void onContextMenuClosed(Menu menu):当菜单项关闭时触发此操作。

例 2 程序运行效果截图

菜单Menu、选项菜单OptionsMenu、上下文菜单ContextMenu、子菜单SubMenu_第2张图片

实现过程:

1.直接编写MainActivity程序

[java]   view plain copy print ?

  1. import  android.app.Activity;  
  2. import  android.os.Bundle;  
  3. import  android.view.ContextMenu;  
  4. import  android.view.Menu;  
  5. import  android.view.MenuItem;  
  6. import  android.view.View;  
  7. import  android.widget.ArrayAdapter;  
  8. import  android.widget.ListView;  
  9. import  android.widget.Toast;  
  10.   
  11. public   class  MainActivity  extends  Activity {  
  12.      private  String data[] = { "狂人日记" "bolg.csdn.net/runninglion" ,  
  13.              "作者:lion" "欢迎进入本博客" "感谢:www.csdn.net" };  
  14.      private  ListView listView;  
  15.   
  16.      @Override   
  17.      protected   void  onCreate(Bundle savedInstanceState) {  
  18.          super .onCreate(savedInstanceState);  
  19.         listView =  new  ListView( this );    //实例化组件   
  20.         listView.setAdapter( new  ArrayAdapter( this ,    //将数据包装   
  21.                 android.R.layout.simple_expandable_list_item_1,    //每行显示一条数据   
  22.                 data));    //设置组件内容   
  23.          super .setContentView(listView);    //将组件添加到屏幕中   
  24.          super .registerForContextMenu(listView);    //添加上下文菜单   
  25.     }  
  26.      @Override   
  27.      public   void  onCreateContextMenu(ContextMenu menu, View view,  
  28.             ContextMenu.ContextMenuInfo menuInfo){  
  29.          super .onCreateContextMenu(menu, view, menuInfo);  
  30.         menu.setHeaderTitle( "信息操作" );  
  31.         menu.add(Menu.NONE, Menu.FIRST +  1 1 "添加联系人" );  
  32.         menu.add(Menu.NONE, Menu.FIRST +  2 2 "查看详情" );  
  33.         menu.add(Menu.NONE, Menu.FIRST +  3 3 "删除信息" );  
  34.         menu.add(Menu.NONE, Menu.FIRST +  4 4 "另存为" );  
  35.         menu.add(Menu.NONE, Menu.FIRST +  5 5 "编辑" );  
  36.     }  
  37.      @Override   
  38.      public   boolean  onContextItemSelected(MenuItem item){  
  39.          switch (item.getItemId()){  
  40.          case  Menu.FIRST +  1 :  
  41.             Toast.makeText( this "你选择了“添加联系人”项" , Toast.LENGTH_LONG).show();  
  42.          break ;  
  43.          case  Menu.FIRST +  2 :  
  44.             Toast.makeText( this "你选择了“查看详情”项" , Toast.LENGTH_LONG).show();  
  45.          break ;  
  46.          case  Menu.FIRST +  3 :  
  47.             Toast.makeText( this "你选择了“删除信息”项" , Toast.LENGTH_LONG).show();  
  48.          break ;  
  49.          case  Menu.FIRST +  4 :  
  50.             Toast.makeText( this "你选择了“另存为”项" , Toast.LENGTH_LONG).show();  
  51.          break ;  
  52.          case  Menu.FIRST +  5 :  
  53.             Toast.makeText( this "你选择了“编辑”项" , Toast.LENGTH_LONG).show();  
  54.          break ;  
  55.         }  
  56.          return   false ;  
  57.     }  
  58.      @Override   
  59.      public   void  onContextMenuClosed(Menu menu){  
  60.         Toast.makeText( this "上下文菜单关闭了" , Toast.LENGTH_LONG).show();  
  61.     }  
  62. }  

  也可以像例 1 一样通过配置资源文件来得到想要显示的菜单项。

 

三、子菜单SubMenu

  可以为每一个菜单定义多个子菜单(SubMenu),子菜单的创建依然要通过Activity类中的onCreateOptionsMenu()方法完成。

例 3 程序运行效果截图

菜单Menu、选项菜单OptionsMenu、上下文菜单ContextMenu、子菜单SubMenu_第3张图片

实现过程:

1. 直接编写MainActivity程序

[java]   view plain copy print ?

  1. import  android.app.Activity;  
  2. import  android.view.Menu;  
  3. import  android.view.MenuItem;  
  4. import  android.view.SubMenu;  
  5. import  android.widget.Toast;  
  6.   
  7. public   class  MainActivity  extends  Activity {  
  8.   
  9.      @Override   
  10.      public   boolean  onCreateOptionsMenu(Menu menu){  
  11.         SubMenu filemenu = menu.addSubMenu( "文件" );  
  12.         SubMenu editmenu = menu.addSubMenu( "编辑" );  
  13.   
  14.         filemenu.add(Menu.NONE, Menu.FIRST +  1 1 "新建" );  
  15.         filemenu.add(Menu.NONE, Menu.FIRST +  2 2 "打开" );  
  16.         filemenu.add(Menu.NONE, Menu.FIRST +  3 3 "保存" );  
  17.         editmenu.add(Menu.NONE, Menu.FIRST +  4 4 "撤销" );  
  18.         editmenu.add(Menu.NONE, Menu.FIRST +  5 5 "恢复" );  
  19.           
  20.          return   true ;  
  21.     }  
  22.      @Override   
  23.      public   boolean  onOptionsItemSelected(MenuItem item){  
  24.          switch (item.getItemId()){  
  25.          case  Menu.FIRST +  1 :  
  26.             Toast.makeText( this "你选择了“新建”项" , Toast.LENGTH_LONG).show();  
  27.          break ;  
  28.          case  Menu.FIRST +  2 :  
  29.             Toast.makeText( this "你选择了“打开”项" , Toast.LENGTH_LONG).show();  
  30.          break ;  
  31.          case  Menu.FIRST +  3 :  
  32.             Toast.makeText( this "你选择了“保存”项" , Toast.LENGTH_LONG).show();  
  33.          break ;  
  34.          case  Menu.FIRST +  4 :  
  35.             Toast.makeText( this "你选择了“撤销”项" , Toast.LENGTH_LONG).show();  
  36.          break ;  
  37.          case  Menu.FIRST +  5 :  
  38.             Toast.makeText( this "你选择了“恢复”项" , Toast.LENGTH_LONG).show();  
  39.          break ;  
  40.         }  
  41.          return   false ;  
  42.     }  
  43. }  

也可以像例 1 一样通过配置资源文件来得到想要显示的子菜单项

你可能感兴趣的:(菜单Menu、选项菜单OptionsMenu、上下文菜单ContextMenu、子菜单SubMenu)