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

摘要:

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

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


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


No.方法类型描述
1public void closeContextMenu()普通关闭上下文菜单
2public void closeOptionsMenu()普通关闭选项菜单
3public void closeOptionsMenu()普通设置上下文菜单项
4public void onContextMenuClosed(Menu menu)普通上下文菜单关闭时触发
5public void onContextMenuClosed(Menu menu)普通创建上下文菜单
6

public void onCreateContextMenu(ContextMenu menu,

 View v, ContextMenu.ContextMenuInfo menuInfo)

普通

当用户选择“Menu”按钮时调用此操作,

可以生成一个选项菜单

7

public boolean

onMenuItemSelected(int featureId, MenuItem item)

普通设置选项菜单项
8

public boolean

onOptionsItemSelected(MenuItem item)

普通当一个选项菜单中的某个菜单项被选中时触发此操作
9public void onOptionsMenuClosed(Menu menu)普通当选项菜单关闭时触发此操作
10public boolean onPrepareOptionsMenu(Menu menu)普通当选项菜单显示之前操作触发此操作
11public void openOptionsMenu()普通打开选项菜单
12public MenuInflater getMenuInflater()普通取得MenuInflater类的对象
13public void registerForContextMenu(View view)普通注册上下文菜单


Menu接口的常用方法及常量

No.方法及常量类型描述
1public static final int FIRST常量用于定义菜单项的编号
2public 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)

普通增加子菜单
7public abstract void removeGroup(int groupId)普通删除一个菜单组
8public abstract void removeItem(int id)普通删除一个菜单项
9public abstract void clear()普通清空菜单
10public abstract void close()普通关闭菜单
11public abstract MenuItem getItem(int index)普通返回指定的菜单项
12public abstract int size()普通返回菜单项的个数


MenuItem接口的常用方法

No. 方法 类型 描述
1public abstract int getGroupId()普通得到菜单组编号
2public abstract Drawable getIcon()普通得到菜单项上的图标
3public abstract int getItemId()普通得到菜单项上的ID
4public abstract int getOrder()普通得到菜单项上的编号
5public abstract SubMenu getSubMenu()普通取得子菜单
6public abstract CharSequence getTitle()普通得到菜单项上的标题
7public abstract boolean isCheckable()普通判断菜单项是否可用
8 public abstract boolean isChecked()普通判断此菜单项是否被选中
9public abstract boolean isEnabled()普通判断此菜单项是否可用
10public abstract boolean isVisible()普通判断此菜单项是否可见
11public abstract MenuItem setCheckable(boolean checkable)普通设置此菜单项是否可用
12public abstract MenuItem setChecked(boolean checked)普通设置此菜单项是否默认选中
13public abstract MenuItem setEnabled(boolean enabled)普通设置此菜单项是否可用
14public abstract MenuItem setIcon(Drawable icon)普通设置此菜单项的图标
15public abstract MenuItem setIcon(int iconRes)普通设置此菜单项的图标
16

public abstract MenuItem

 setOnMenuItemClickListener(MenuItem.OnMenuItemClic

kListener menuItemClickListener)

普通设置此菜单项的监听操作
17public abstract MenuItem setTitle(CharSequence title)普通设置此菜单项的标题
18public 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>
MenuInflater

        配置文件之中通过“<item>”元素定义了多个菜单项,而这些菜单项中的内容与之前的程序代码是一样的,此时如果希望从配置文件之中取出数据,则修改onCreateOptionsMenu()方法,但是在编写此方法的时候需要使用到Activity类中的getMenuInflater()方法先取得MenuInflater类的对象,此类的功能也是将配置文件中定义的组件进行实例化,常用方法如下:

No. 方法 类型 描述
1public MenuInflater(Context context)构造创建MenuInflater类对象
2public 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程序,显示上下文菜单

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. 方法 类型 描述
1public abstract MenuItem getItem()普通得到一个子菜单所属的父菜单对象
2public abstract SubMenu setHeaderIcon(int iconRes)普通设置菜单的显示图标
3public abstract SubMenu setHeaderTitle(int titleRes)普通设置子菜单的显示标题
4public abstract SubMenu setHeaderTitle(CharSequence title)普通设置子菜单的显示标题
5public 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 ;
}










阅读更多
想对作者说点什么? 我来说一句

android 自定义菜单

2018年01月24日 16.63MB 下载

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

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭