Android中的基本控件——菜单:Menu

摘要:

  • 菜单在系统的开发之中是必不可少的一种组件,在Android手机上往往都会存在一个“Menu”的键当选择之后会在屏幕的底部显示系统的菜单,在一个菜单之中可以包含多个菜(MenuItem),在一个菜单之中最多只会显示2排3列的菜单项,如果现在的菜单项超出了6个,则超出部分会自动隐藏,而且会自动出现一个“更多”的菜单项提示用户。

  • 在Android系统之中,菜单一共有三类:选项菜单(OptionsMenu)、上下文(ContextMenu)和子菜单(SubMenu)。

Activity类中定义的菜单操作方法

No. 方法 类型 描述
1 public void closeContextMenu() 普通 关闭上下文菜单
2 public void closeOptionsMenu() 普通 关闭选项菜单
3 public void closeOptionsMenu() 普通 设置上下文菜单项
4 public void onContextMenuClosed(Menu menu) 普通 上下文菜单关闭时触发
5 public void onContextMenuClosed(Menu menu) 普通 创建上下文菜单
6 public void onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo) 普通 当用户选择“Menu”按钮时调用此操作,可以生成一个选项菜单
7 public booleanonMenuItemSelected(int featureId, MenuItem item) 普通 设置选项菜单项
8 public booleanonOptionsItemSelected(MenuItem item) 普通 当一个选项菜单中的某个菜单项被选中时触发此操作
9 public void onOptionsMenuClosed(Menu menu) 普通 当选项菜单关闭时触发此操作
10 public boolean onPrepareOptionsMenu(Menu menu) 普通 当选项菜单显示之前操作触发此操作
11 public void openOptionsMenu() 普通 打开选项菜单
12 public MenuInflater getMenuInflater() 普通 取得MenuInflater类的对象
13 public void registerForContextMenu(View view) 普通 注册上下文菜单

Menu接口的常用方法及常量

No. 方法及常量 类型 描述
1 public static final int FIRST 常量 用于定义菜单项的编号
2 public static final int NONE 常量 表示菜单不分组
3 public abstract MenuItem add(int groupId, int itemId, int order,CharSequence title) 普通 此方法用于向菜单之中添加菜单项,参数作用: groupId:菜单所在的组编号;itemId:菜单项的ID;order:菜单的出现顺序;title:菜单的显示文字。
4 public abstract MenuItem add(int groupId, int itemId, int order, int titleRes) 普通 增加菜单项
5 public abstract SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) 普通 增加子菜单
6 public abstract SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) 普通 增加子菜单
7 public abstract void removeGroup(int groupId) 普通 删除一个菜单组
8 public abstract void removeItem(int id) 普通 删除一个菜单项
9 public abstract void clear() 普通 清空菜单
10 public abstract void close() 普通 关闭菜单
11 public abstract MenuItem getItem(int index) 普通 返回指定的菜单项
12 public abstract int size() 普通 返回菜单项的个数

MenuItem接口的常用方法

No. 方法及常量 类型 描述
1 public abstract int getGroupId() 普通 得到菜单组编号
2 public abstract Drawable getIcon() 普通 得到菜单项上的图标
3 public abstract int getItemId() 普通 得到菜单项上的ID
4 public abstract int getOrder() 普通 得到菜单项上的编号
5 public abstract SubMenu getSubMenu() 普通 取得子菜单
6 public abstract CharSequence getTitle() 普通 得到菜单项上的标题
7 public abstract boolean isCheckable() 判断菜单项是否可用
8 ublic abstract boolean isChecked() 普通 判断此菜单项是否被选中
9 public abstract boolean isEnabled() 普通 判断此菜单项是否可用
10 public abstract boolean isVisible() 普通 判断此菜单项是否可见
11 public abstract MenuItem setCheckable(boolean checkable) 普通 设置此菜单项是否可用
12 public abstract MenuItem setChecked(boolean checked) 普通 设置此菜单项是否默认选中
13 public abstract MenuItem setEnabled(boolean enabled) 普通 设置此菜单项是否可用
14 public abstract MenuItem setIcon(Drawable icon) 普通 设置此菜单项的图标
15 public abstract MenuItem setIcon(int iconRes) 普通 设置此菜单项的图标
16 public abstract Menu ItemsetOnMenuItemClickListener (MenuItem.OnMenuItemClic kListener menuItemClickListener) 普通 设置此菜单项的监听操作
17 public abstract MenuItem setTitle(CharSequence title) 普通 设置此菜单项的标题
18 public abstract MenuItem setVisible(boolean visible) 普通 设置此菜单项是否可见
19 public abstract ContextMenu.ContextMenuInfo getMenuInfo() 普通 得到菜单中的内容

选项菜单:OptionsMenu

选项菜单是一个最基本的菜单,也是用户在使用手机时最常见的一种形式,如果要想实现选项菜单,则直接在程序之中覆写android.app.Activity类的如下几个方法:

  • public boolean onCreateOptionsMenu(Menu menu):在此方法之中设置多个菜单项(MenuItem);
  • 返回值:返回true表示显示菜单,反之则不显示;
  • public boolean onOptionsItemSelected(MenuItem item):在此方法之中判断菜单项的操作;
  • public void onOptionsMenuClosed(Menu menu):当菜单关闭时触发此操作;
  • public boolean onPrepareOptionsMenu(Menu menu):在菜单显示前触发此操作;

在main.xml文件之中定义要显示的组件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout                       <!-线性布局-->
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/MyLayout"              <!-布局管理器ID-->
    android:orientation="vertical"          <!-所有组件垂直摆放-->
    android:layout_width="fill_parent"          <!-布局管理器宽度为屏幕宽度-->
    android:layout_height="fill_parent">            <!-布局管理器高度为屏幕高度-->
    <TextView                   <!-文本显示组件-->
        android:id="@+id/txt"           <!-组件ID,程序中使用-->
        android:layout_width="wrap_content"     <!-组件宽度为文字宽度-->
        android:layout_height="wrap_content"        <!-组件高度为文字高度-->
        android:text="按下Menu键出现选项菜单"/>      <!-默认显示文字-->
</LinearLayout>

定义Activity程序,覆写相应方法以实现菜单的显示

package org.lxh.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MyMenuDemo extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.main);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {     // 显示菜单
        menu.add(Menu.NONE,             // 菜单不分组
            Menu.FIRST + 1,             // 菜单项ID
            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()) {     // 判断菜单项ID
        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/menu/mymenu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">       
    <item                       
        android:id="@+id/item01"                
        android:title="添加"              
        android:icon="@android:drawable/ic_menu_add" />     
    <item   android:id="@+id/item02"            
        android:title="保存"              
        android:icon="@android:drawable/ic_menu_save" />        
    <item   android:id="@+id/item03"            
        android:title="编辑"              
        android:icon="@android:drawable/ic_menu_edit" />        
    <item   android:id="@+id/item04"            
        android:title="详细"              
        android:icon="@android:drawable/ic_menu_info_details" />    
    <item   android:id="@+id/item05"            
        android:title="删除"              
        android:icon="@android:drawable/ic_menu_delete" />  
    <item   android:id="@+id/item06"            
        android:title="发送"              
        android:icon="@android:drawable/ic_menu_send" />        
    <item   android:id="@+id/item06"            
        android:title="帮助"              
        android:icon="@android:drawable/ic_menu_help" />        
    <item   android:id="@+id/item07"            
        android:title="发送"              
        android:icon="@android:drawable/ic_menu_send" />        
</menu>
  • 配置文件之中通过“”元素定义了多个菜单项,而这些菜单项中的内容与之前的程序代码是一样的,此时如果希望从配置文件之中取出数据,则修改onCreateOptionsMenu()方法,但是在编写此方法的时候需要使用到Activity类中的getMenuInflater()方法先取得MenuInflater类的对象,此类的功能也是将配置文件中定义的组件进行实例化,常用方法如下:
No. 方法 类型 描述
1 public MenuInflater(Context context) 构造 创建MenuInflater类对象
2 public void inflate(int menuRes, Menu menu) 普通 将配置的资源填充到菜单之中

修改onCreateOptionsMenu()`

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

上下文菜单:ContextMenu

  • 上下文菜单非常类似于在windows操作系统中的右键菜单的操作形式,在使用支持Android操作系统手机时,如果在一个列表显示(ListView)操作中,用户可以通过长按操作打开某些操作的菜单,而这种菜单就是上下文菜单,要进行上下文菜单的操作只需要在Activity程序之中覆写如下方法即可:
  • public void onCreateContextMenu(ContextMenu menu, View v ,ContextMenu. ContextMenuInfo menuInfo):在此方法之中可以设置所需要显示的所有菜单项;
  • public boolean onContextItemSelected(MenuItem item):当某一个菜单项被选中时触发此操作;
  • public void onContextMenuClosed(Menu menu):当菜单项关闭时触发此操作。

定义Activity程序,显示上下文菜单

上下文菜单非常类似于在windows操作系统中的右键菜单的操作形式,在使用支持Android操作系统手机时,如果在一个列表显示(ListView)操作中,用户可以通过长按操作打开某些操作的菜单,而这种菜单就是上下文菜单,要进行上下文菜单的操作只需要在Activity程序之中覆写如下方法即可:
     public void onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo):在此方法之中可以设置所需要显示的所有菜单项; 
        public boolean onContextItemSelected(MenuItem item):当某一个菜单项被选中时触发此操作; 
        public void onContextMenuClosed(Menu menu):当菜单项关闭时触发此操作。 
定义Activity程序,显示上下文菜单
public class MyMenuDemo extends Activity {
    private String data[] = {"mju", "mju java", "mju 闽江学院", "mju 郑鸿", "mju job"};       // 定义显示的数据
    private ListView listView;                  // 定义ListView组件
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.listView = new ListView(this) ;            // 实例化组件
        listView.setAdapter(new ArrayAdapter<String>(this,      // 将数据包装
                android.R.layout.simple_expandable_list_item_1, // 每行显示一条数据
                this.data));            // 设置组件内容
        super.setContentView(this.listView);            // 将组件添加到屏幕之中
        super.registerForContextMenu(this.listView) ;       // 注册上下文菜单
    }
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {// 显示菜单
        super.onCreateContextMenu(menu, v, menuInfo) ;
        menu.setHeaderTitle("信息操作") ;           // 设置显示信息头
        menu.add(Menu.NONE, Menu.FIRST + 1, 1, "添加联系人");        // 设置菜单项
        menu.add(Menu.NONE, Menu.FIRST + 2, 2, "查看详情");     // 设置菜单项
        menu.add(Menu.NONE, Menu.FIRST + 3, 3, "删除信息");         // 设置菜单项
        menu.add(Menu.NONE, Menu.FIRST + 4, 4, "另存为");      // 设置菜单项
        menu.add(Menu.NONE, Menu.FIRST + 5, 5, "编辑");       // 设置菜单项
@Override
    public boolean onContextItemSelected(MenuItem item) {       // 选中某个菜单项
        switch (item.getItemId()) {         // 判断菜单项ID
        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;
        }
        return false;
    }
    @Override
    public void onContextMenuClosed(Menu menu) {            // 菜单退出时调用
        Toast.makeText(this, "上下文菜单关闭了", Toast.LENGTH_LONG).show();
    }
}

在res/menu/mymenu.xml文件之中定义菜单项的资源文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item01" android:title="添加联系人" /> 
    <item android:id="@+id/item02" android:title="查看详情" />  
    <item android:id="@+id/item03" android:title="删除信息" />  
    <item android:id="@+id/item04" android:title="另存为" />       
    <item android:id="@+id/item05" android:title="编辑" />        
</menu>

修改Activity程序,读取所有菜单项

@Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {                                       // 显示菜单
        super.onCreateContextMenu(menu, v, menuInfo) ;
        menu.setHeaderTitle("信息操作") ;       // 设置显示信息头
        super.getMenuInflater().inflate(R.menu.mymenu, menu);       // 填充菜单项
    }

子菜单:SubMenu

  • 当在系统之中定义完菜单之后,也可以为每一个菜单里面定义多个子(SubMenu),在SubMenu接口之中定义的常用方法
no. 方法 类型 描述
1 public abstract MenuItem getItem() 普通 得到一个子菜单所属的父菜单对象
2 public abstract SubMenu setHeaderIcon(int iconRes) 普通 设置菜单的显示图标
3 public abstract SubMenu setHeaderTitle(int titleRes) 普通 设置子菜单的显示标题
4 public abstract SubMenu setHeaderTitle(CharSequence title) 普通 设置子菜单的显示标题
5 public abstract SubMenu setIcon(int iconRes) 普通 设置每个子菜单项的图标

定义子菜单

public class MyMenuDemo extends Activity {
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {     // 显示菜单
        SubMenu fileMenu = menu.addSubMenu("文件");   // 子菜单
        SubMenu editMenu = menu.addSubMenu("编辑");   // 子菜单
        fileMenu.add(Menu.NONE, Menu.FIRST + 1, 1, "新建") ;  // 子菜单项
        fileMenu.add(Menu.NONE, Menu.FIRST + 2, 2, "打开") ;  // 子菜单项
        fileMenu.add(Menu.NONE, Menu.FIRST + 3, 3, "保存") ;  // 子菜单项
        editMenu.add(Menu.NONE, Menu.FIRST + 4, 4, "撤消");   // 子菜单项
        editMenu.add(Menu.NONE, Menu.FIRST + 5, 5, "恢复");   // 子菜单项 
        return true ;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {   // 选中某个菜单项
        switch (item.getItemId()) {     // 判断菜单项ID
        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;
        }
        return false;
    }
}

通过配置文件保存菜单内容

  • 定义fileMenu的子菜单内容文件 —— res/menu/filemenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item01" android:title="新建" />        <!-定义菜单项-->
    <item android:id="@+id/item02" android:title="打开" />        <!-定义菜单项-->
    <item android:id="@+id/item03" android:title="保存" />        <!-定义菜单项-->
  • 定义editMenu的子菜单内容文件—— res/menu/editmenu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/item04" android:title="撤消" />   <!-定义菜单项-->
    <item android:id="@+id/item05" android:title="恢复" />    <!-定义菜单项-->
</menu>

修改Activity程序,通过配置文件读取子菜单项

@Override
public boolean onCreateOptionsMenu(Menu menu) { // 显示菜单
    SubMenu fileMenu = menu.addSubMenu("文件");       // 子菜单
    SubMenu editMenu = menu.addSubMenu("编辑");       // 子菜单
    super.getMenuInflater().inflate(R.menu.filemenu, fileMenu) ;// 设置菜单项
    super.getMenuInflater().inflate(R.menu.editmenu, editMenu) ;// 设置菜单项
    return true ;
}

作者:张俊强
原文链接点击这里

展开阅读全文

没有更多推荐了,返回首页