`
TonySun3544
  • 浏览: 161295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android中的Menu点滴记录

阅读更多

 

      菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu"键,由此可见菜单在Android程序中的特殊性。Android SDK提供的菜单有如下几种:

选项菜单:最常规的菜单,android中把它叫做option menu

子菜单:android中点击子菜单将弹出悬浮窗口显示子菜单项。子菜单不支持嵌套,即子菜单中不能再包括其他子菜单。

上下文菜单:android长按视图控件后出现的菜单,windows点击右键弹出的菜单即上下文菜单

图标菜单:这个比较简单,就是带icon的菜单项,需要注意的是子菜单项、上下文菜单项、扩展菜单项均无法显示图标

 

创建options menu

之前提到,Androidactivity已经为我们提前创建好了android.view.Menu对象,并提供了回调方法onCreateOptionsMenu(Menu menu)供我们初始化菜单的内容。该方法只会在选项菜单第一次显示的时候被执行,如果你需要动态改变选项菜单的内容,请使用 onPrepareOptionsMenu(Menu menu)

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	// 虽然目前android还没有系统菜单,但是为了兼容到以后的版本,最好加上
	super.onCreateOptionsMenu(menu);
	// 第一个参数代表组号,android中你可以给菜单分组,以便快速地操作同一组的菜单。
	// 第二个参数代表Menu的唯一的ID号,可以自己指定,也可以让系统来自动分配,在响应菜单时你需要通过ID号来判断点击了哪个菜单。
	// 第三个参数代表Menu显示顺序的编号,编号小的显示在前面。
	// 第四个参数代表标题
	menu.add(0, MENUITEM1, MENUITEM1, "关于");
	menu.add(0, MENUITEM2, MENUITEM2, "帮助");
	menu.add(0, MENUITEM3, MENUITEM3, "更多");

	return true;
}

 可以对Menu进行分组:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
	super.onCreateOptionsMenu(menu);
	// 添加4个菜单项,分成2组
	int group1 = 1;
	int gourp2 = 2;
	menu.add(group1, 1, 1, "item 1");
	menu.add(group1, 2, 2, "item 2");
	menu.add(gourp2, 3, 3, "item 3");
	menu.add(gourp2, 4, 4, "item 4");
	return true;
}

 分组之后就能使用menu中提供的方法对组进行操作了,如下:menu.removeGroup(group1); //删除一组菜单

menu.removeGroup(group1);    //删除一组菜单
menu.setGroupVisible(gourp2, visible);    //设置一组菜单是否可见
menu.setGroupEnabled(gourp2, enabled);    //设置一组菜单是否可点
menu.setGroupCheckable(gourp2, checkable, exclusive);    //设置一组菜单的勾选情况

 响应菜单项

 

android提供了多种响应菜单项的方式,下面一一介绍

1、通过onOptionsItemSelected方法

使用的最多方法是重写activity类的 onOptionsItemSelected(Menu Item)回调方法,每当有菜单项被点击时,android就会调用该方法,并传入被点击菜单项。

 @Override

public boolean onOptionsItemSelected(MenuItem item) {
	switch (item.getItemId()) {
	// 响应每个菜单项(通过菜单项的ID)
	case MENUITEM1:
		break;
	case MENUITEM2:
		break;
	case MENUITEM3:
		break;
	default:
		// 对没有处理的事件,交给父类来处理
		return super.onOptionsItemSelected(item);
	}
	// 返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了
	return true;
}

 2.使用监听器

虽然第一种方法是推荐使用的方法,android还是提供了类似java swing的监听器方式来响应菜单。使用监听器的方式分为两步:

第一步:创建监听器类

class MenuItemListener implements OnMenuItemClickListener {
	// 该方法先于onOptionsItemSelected执行。
	@Override
	public boolean onMenuItemClick(MenuItem item) {
		return false;
	}
}

 

 第二步:为菜单项注册监听器

menu.getItem(0).setOnMenuItemClickListener(new MenuItemListener()); // 为MenuItem添加监听事件

 3.使用Intent响应菜单

menu.getItem(1).setIntent(new Intent()); // 可以为MenuItem添加Intent

 

子菜单sub Menu

Android支持子菜单,你可以通过addSubMenu(int groupId, int itemId, int order, int titleRes)方法创建和响应子菜单。

/**
 * 使用的最多方法是重写activity类的 onOptionsItemSelected(Menu
 * Item)回调方法,每当有菜单项被点击时,android就会调用该方法,并传入被点击菜单项。
 */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
	Resources res = getBaseContext().getResources();
	// 第一个参数代表组号,android中你可以给菜单分组,以便快速地操作同一组的菜单。
	// 第二个参数代表Menu的唯一的ID号,可以自己指定,也可以让系统来自动分配,在响应菜单时你需要通过ID号来判断点击了哪个菜单。
	// 第三个参数代表Menu显示顺序的编号,编号小的显示在前面。
	// 第四个参数代表标题
	SubMenu about = menu.addSubMenu(0, MENUITEM1, MENUITEM1, "关于"); // 添加菜单项(多种方式)
	SubMenu help = menu.addSubMenu(0, MENUITEM2, MENUITEM2, "帮助");
	SubMenu more = menu.addSubMenu(0, MENUITEM3, MENUITEM3, "更多");
	// 为MenuItem设置图标
	about.setIcon(res.getDrawable(R.drawable.ic_launcher));
	help.setIcon(res.getDrawable(R.drawable.ic_launcher));
	more.setIcon(res.getDrawable(R.drawable.ic_launcher));

	// 为more菜单添加子订单
	MenuItem display = more.add(0, MENUITEM3, MENUITEM3, "设置");
	display.setIcon(R.drawable.ic_launcher);// 子菜单项不支持显示图标,这样做是没意义的,尽管不会报错!
	more.add(0, MENUITEM3, MENUITEM3, "退出");
	more.setHeaderIcon(R.drawable.ic_launcher); // 以添加子菜单项栏目的标题图标

	return true;
}

 Menu可以包含多个SubMenuSubMenu可以包含多个MenuItem,但是SubMenu不能包含SubMenu,及子菜单不能嵌套

 

图标菜单icon Menu

Android支持在菜单上显示各种各样的图标,这一点我们在上面创建子菜单时已经用到了。图标菜单严格上说并不算是一种菜单的新类型,它的使用也很简单,之所以单独设一节是为了说明使用Icon的一些限制。Android中并不是所谓的菜单项都能加上图标,以下菜单项都是不可以的(这并不意味着程序会报错,而是运行时图标得不到显示):

· 扩展的菜单项

· 子菜单的菜单项

· 上下文菜单的菜单项

除此以外,带Icon的菜单项不能加上复选框(check mark)

 

 

上下文菜单ContextMenu

android是通过长按某个视图元素来弹出上下文菜单的,图标和子菜单都无法用在Android的上下文菜单项中。

上下文菜单继承了android.view.Menu,因此我们可以像操作Options Menu那样给上下文菜单增加菜单项。上下文菜单与Options Menu最大的不同在于,Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View。每个Activity有且只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,并不是每个View都有上下文菜单,这就需要我们显示地通过registerForContextMenu(Viewview)来指定

尽管上下文菜单的拥有者是View,生成上下文菜单却是通过Activity中的onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo)方法,该方法很像生成Options MenuonCreateOptionsMenu(Menu menu)方法。两者的不同在于,onCreateOptionsMenu只在用户第一次Menu键时被调用,而onCreateContextMenu会在用户每一次长按View时被调用,而且View必须已经注册了上下文菜单。

另一个值得注意的就是ContextMenuInfo,该类的对象被传入onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo)方法,那么它有什么用呢?有时候,视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的ID等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。

1.activityonCreate(...)方法中为一个view注册上下文菜单

public class MyListActivity extends ListActivity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.two);
		simpleShowList();

		this.registerForContextMenu(getListView());
	}

	private void simpleShowList() {
		String[] item = new String[] { "ListItem1", "ListItem2", "ListItem3", ListItem4" };
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
				android.R.layout.simple_list_item_1, item);
		this.setListAdapter(adapter);
	}
}
 

2.onCreateContextMenuInfo(...)中生成上下文菜单。

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
		ContextMenuInfo menuInfo) {
	menu.setHeaderTitle("文件操作");
	menu.add(0, 1, Menu.NONE, "发送");
	menu.add(0, 2, Menu.NONE, "复制");
	menu.add(0, 3, Menu.NONE, "重命名");
	menu.add(0, 4, Menu.NONE, "删除");
}
  

3.onContextItemSelected(...)中响应上下文菜单项。

 

@Override
public boolean onContextItemSelected(MenuItem item) {
	// 得到当前被选中的item信息
	AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
	switch (item.getItemId()) {
	case 1: 
		break;
	case 2: 
		break;
	case 3: 
		break;
	case 4:
		break;
	default:
		return super.onContextItemSelected(item);
	}
	return true;
}
 

 

Menu关闭

如果需要动态的显示菜单可以在菜单关闭时进行相应的清除处理:

@Override
public void onOptionsMenuClosed(Menu menu) {
	menu.clear();
	super.onOptionsMenuClosed(menu);
}
分享到:
评论

相关推荐

    android menu菜单距中显示

    在Android应用开发中,`Menu`是用户界面中不可或缺的一部分,它通常用于在特定操作(如选项、更多操作)上为用户提供快捷访问的途径。在Android系统中,`Menu`通常出现在活动(Activity)的顶部作为选项菜单,或者在...

    Android自定义menu的实现

    Android中的Menu主要分为三类:Option Menu(主菜单)、Context Menu(上下文菜单)和PopupMenu(弹出式菜单)。Option Menu通常在ActionBar或Toolbar中显示,而Context Menu则在长按某个视图时出现,PopupMenu可以...

    Android中使用Menu

    在Android活动中使用Menu,简单的程序。适应于初学者。 通过res中创建Menu文件,在Activity中通过onCreateOptionsMenu()方法和onOptionsItemSelected()方法实现菜单栏功能

    Android MenuDemo Menu全面讲解

    在Android中,主要有三种类型的Menu:选项菜单(OptionsMenu)、上下文菜单(Context Menu)和弹出窗口菜单(PopupMenu)。 二、创建Menu 1. 在Activity的XML布局文件中不直接创建Menu,而是通过在res/menu目录下...

    Android 按Menu弹出菜单

    总的来说,Android中的Menu机制是提供给用户便捷访问应用功能的关键组件。通过合理的布局设计、交互逻辑以及视觉效果,可以极大地提升应用的易用性和用户体验。在开发过程中,开发者应该充分考虑用户需求,结合应用...

    Android DropDownMenu下拉菜单.zip

    在Android开发中,`DropDownMenu`是一种常见的交互元素,它允许用户从一组选项中选择一个,通常用于空间有限的界面,如顶部导航栏或者侧滑菜单。本资源提供了`Android DropDownMenu`的一个实现,特点是拥有漂亮的...

    android 另类menu菜单提示

    在Android中,我们可以通过重写`onCreateOptionsMenu(Menu menu)`方法来自定义菜单项。但为了实现另类Menu,我们可以创建自己的布局文件,包含我们需要的按钮或其他控件,并在需要显示菜单时将其添加到界面上。这...

    Android_Menu.rar_Android_menu_android_android简单

    在Android中,菜单主要用于在特定场景下显示额外的功能选项,比如在活动(Activity)的顶部或者右上角的“汉堡”图标中。要实现一个菜单,首先我们需要在项目的res/menu目录下创建XML文件来定义菜单项。例如,可以...

    android自定义menu

    本文将深入探讨如何在Android中实现自定义`Menu`,结合源码解析以及工具的使用,帮助你更好地理解这一过程。 首先,`Menu`是Android系统中的一个接口,它用于构建应用程序的上下文操作菜单。通常,我们会在`...

    Android UI之样式Menu

    首先,菜单(Menu)在Android中主要用于在屏幕顶部或浮动按钮上展示一组操作选项。它通常在三种上下文中使用:选项菜单(Option Menu)、上下文菜单(Context Menu)和弹出式菜单(Popup Menu)。我们主要关注的是...

    android sliding menu 滑动菜单

    在Android应用开发中,滑动菜单(Sliding Menu)是一种常见的设计模式,它允许用户通过从屏幕边缘向内滑动来展示隐藏的侧边栏菜单。这种设计在移动设备上非常流行,因为它提供了便捷的导航方式,特别是在内容丰富的...

    Android代码-menu单选菜单.zip

    在本资源“menu单选菜单.zip”中,我们很显然关注的是如何在Android中创建和使用单选菜单(Radio Menu)。单选菜单允许用户在多个选项中选择一个,只有一个选项可以被选中。接下来,我们将深入探讨这一主题。 首先...

    Android menu单选菜单.rar

    在标题“Android menu单选菜单.rar”中提到的,我们将关注如何在Android中实现一个单选菜单,即单选列菜单(Radio Button in Menu)。这种菜单允许用户在多个选项中选择一个,就像单选按钮一样。 单选菜单通常在...

    Android Menu和ListView 整合设计 源码

    Android Menu和ListView 整合设计 源码 package com.MyMenu; import android.app.Activity; import android.database.Cursor; import android.database.sqlite.SQLiteCursor; import android.os.Bundle; import ...

    android Menu 菜单

    在Android应用开发中,Menu是用户界面不可或缺的一部分,它提供了在屏幕顶部或底部显示一系列操作选项的功能。Android Menu主要用于在不占用屏幕空间的情况下为用户提供多种交互方式,如在活动(Activity)的顶部弹...

    Android源码——menu单选菜单.zip

    总结,Android中的单选菜单既可以通过菜单资源系统实现,也可以通过RadioGroup和RadioButton组合实现。这两种方法各有优缺点,开发者可以根据具体需求选择合适的方式。通过熟练掌握这些知识,能为用户提供更直观、...

    Android 创建菜单Menu

    本篇将深入探讨如何在Android中创建和使用Menu,以及相关源码分析。 首先,让我们了解Menu的基本结构。在Android中,Menu由`Menu`接口表示,它包含一系列的`MenuItem`对象。每个`MenuItem`代表一个可点击的选项,...

    android开发之基础menu篇

    在Android中,Menu主要分为三类:Option Menu(选项菜单)、Context Menu(上下文菜单)和Popup Menu(弹出式菜单)。Option Menu通常在屏幕顶部显示,当用户点击菜单键或者动作栏上的三个点时出现;Context Menu则...

    Android代码-android-dropdown-menu

    android-dropdown-menu An dropdown menu for android, you can attach your own listView(s) with this. 文档 DropdownMenu Demo Usage You can use this to make several(as you want) listViews act like ...

Global site tag (gtag.js) - Google Analytics