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

来源:互联网 发布:万网域名不备案能用吗 编辑:程序博客网 时间:2024/05/21 05:20

菜单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 程序运行效果截图

实现过程:

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>

  在此配置文件中通过<item>元素定义了多个菜单项,要从此配置文件中取出数据,就要修改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 程序运行效果截图

实现过程:

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<String>( 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 程序运行效果截图

实现过程:

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 一样通过配置资源文件来得到想要显示的子菜单项。

1 0
原创粉丝点击