Android的上下文菜单和子菜单

在博客standupTimer项目中选项菜单的应用中粗略的介绍了standupTimer项目的选项菜单,也就是把standupTimer项目中选项菜单相关的源码贴出来,并没有做任何的延伸。Android的菜单主要包括选项菜单(OptionsMenu),内容菜单(ContextMenu)和子菜单(SubMenu)三种菜单,这篇博客算是standupTimer项目中选项菜单的应用的延伸,主要总结下内容菜单和子菜单。

内容菜单(ContextMenu)又称为上下文菜单或者长按菜单,当用户长按住一个注册了上下文菜单的控件时,会弹出一个上下文菜单,它是一个流式的列表,供用户选择某项;内容菜单扩展自Menu,提供了修改上下文菜单头(header)的功能,上下文菜单不支持菜单项的快捷方式和图标,但是可以为上下文菜单设置图标。

  其实掌握了内容菜单的编程套路,内容菜单容器来也是蛮简单的,至少最基本的用法很容易就能掌握,下面把内容菜单的基本使用代码贴下来,代码包括两部分,一部分是为TextView控件增加内容菜单,另外一部分是为ListView控件增加内容菜单。

下面是为TextView控件增加内容菜单的代码:

首先要在布局的xml文件中增加一个TextView控件并实现实例化,还要为TextView控件注册上下文菜单:

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);

	lv = (ListView) this.findViewById(R.id.lv);  
	this.registerForContextMenu(lv); 
}

然后实现函数onCreateContextMenu()创建上下文菜单,当长按TextView控件的时候,onCreateContextMenu()函数会被调用,函数中把定义好的xml文件直接填充进来,onCreateContextMenu()函数和xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/settings"
        android:alphabeticShortcut="s"
        android:icon="@android:drawable/ic_menu_preferences"
        android:title="@string/settings_label"/>
    <item
        android:id="@+id/teams"
        android:alphabeticShortcut="t"
        android:icon="@drawable/team"
        android:title="@string/team_label"/>
    <item
        android:id="@+id/about"
        android:alphabeticShortcut="a"
        android:icon="@android:drawable/ic_menu_info_details"
        android:title="@string/about_label"/>
    <item
        android:id="@+id/help"
        android:alphabeticShortcut="h"
        android:icon="@android:drawable/ic_menu_help"
        android:title="@string/help_label"/>

</menu>

public void onCreateContextMenu(ContextMenu menu, View v,  ContextMenuInfo menuInfo) {  
	super.onCreateContextMenu(menu, v, menuInfo);  

	MenuInflater inflater = getMenuInflater();
	inflater.inflate(R.menu.menu, menu);
}

以上是静态方式实现上下文菜单,还可以在onCreateContextMenu()函数中动态的实现上下文菜单,一个简单的实现代码如下:

public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
	super.onCreateContextMenu(menu, v, menuInfo);
	menu.setHeaderTitle("Title");
	menu.setHeaderIcon(R.drawable.team);
	menu.add(0, 0, 0, "复制");
	menu.add(0, 1, 0, "剪贴");
	menu.add(0, 2, 0, "重命名");
}
最后添加菜单选择监听事件,也就是覆盖函数onContextItemSelected(),当上下文菜单被选择的时候,该函数会被调用:
public boolean onContextItemSelected (MenuItem item) {  
        switch (item.getItemId()) {  
        case R.id.about:  
            Logger.d("Displaying the about box");  
            displayAboutBox();  
            return true;  
        case R.id.help:  
            Logger.d("Displaying the help dialog");  
            displayHelpDialog();  
            return true;  
        case R.id.settings:  
            Logger.d("Displaying the settings");  
            displaySettings();  
            return true;  
        case R.id.teams:  
            Logger.d("Displaying the team configuration");  
            displayTeamConfiguration();  
            return true;  
        default:  
            Logger.e("Unknown menu item selected");  
            return false;  
        }  
    }
下面是为ListView控件实现上下文菜单代码:
和TextView类似,首先要在布局的xml文件中增加一个ListView控件并实现实例化,还要为ListView控件注册上下文菜单:

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);

lv = (ListView) this.findViewById(R.id.lv);
this.registerForContextMenu(lv);
initListView();//对ListView进行初始化,也就是设置适配器adapter;

private void initListView() {
	menuStrs = new String[] { "TEST1", "TEST2", "TEST3", "TEST4" };
	adapter = new ArrayAdapter<String>(this,
			android.R.layout.simple_list_item_1, menuStrs);
	lv.setAdapter(adapter);
}

然后实现函数onCreateContextMenu()创建上下文菜单,当长按ListView控件中的一个选项的时候,onCreateContextMenu()函数会被调用,函数中把定义好的xml文件直接填充进来,xml文件同在上面定义的,onCreateContextMenu()函数和如下:

public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {
	super.onCreateContextMenu(menu, v, menuInfo);
	MenuInflater inflater = getMenuInflater();
	inflater.inflate(R.menu.menu, menu);
}

最后添加菜单选择监听事件,也就是覆盖函数onContextItemSelected (),当上下文菜单被选择的时候,该函数会被调用:

public boolean onContextItemSelected(MenuItem item) {
	AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();
	switch (item.getItemId()) {
	case R.id.about:
			menuStrs[menuInfo.position] += "about";
			displayAboutBox();
			return true;
		case R.id.help:
			menuStrs[menuInfo.position] += "help";
			displayHelpDialog();
			return true;
		case R.id.settings:
			menuStrs[menuInfo.position] += "settings";
			displaySettings();
			return true;
		case R.id.teams:
			menuStrs[menuInfo.position] += "teams";
			displayTeamConfiguration();
			return true;
		default:
			menuStrs[menuInfo.position] += "Unknown menu item selected";
			return false;
		}
	adapter.notifyDataSetChanged();
	return true;
}

从上面可以看出实现为控件增加上下文菜单。总的来说也主要分为三部:

第一步:覆盖onCreateContextMenu()方法,或者静态或者动态的创建上下文菜单;

第二部:覆盖onOptionsItemSelected()方法,为上下文菜单实现监听函数;

第三部:为控件注册上下文菜单,这里的注册函数registerForContextMenu()是将控件和上下文菜单联系起来的桥梁;

  子菜单和选项菜单比较类似,它的特点是可以将菜单进行分组,更方面用户进行选择和操作,其实无论是选项菜单,子菜单还是上下文菜单,创建方式都有两种,一种是使用xml文件静态创建,另外一种是使用动态方式创建,子菜单的示例使用静态方式进行创建,动态创建需要的时候再自己搜索下就OK了。

子菜单的应用和选项菜单的应用基本上是相同的,就静态创建菜单方式而言,子菜单和选项菜单xml是不同的,所要覆盖的函数完全相同。

使用子菜单的示例代码如下:

首先创建xml文件,供onCreateOptionsMenu()调用的时候加载,xml文件定义如下:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/file"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="文件操作">
        <menu>
            <item
                android:id="@+id/new_file"
                android:showAsAction="never"
                android:title="新建"/>
            <item
                android:id="@+id/open_file"
                android:showAsAction="never"
                android:title="打开"/>
            <item
                android:id="@+id/edit_file"
                android:showAsAction="never"
                android:title="编辑"/>
        </menu>
    </item>
    <item
        android:id="@+id/set"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="设置">
        <menu>
            <item
                android:id="@+id/delete_set"
                android:showAsAction="never"
                android:title="删除"/>
            <item
                android:id="@+id/exit_set"
                android:showAsAction="never"
                android:title="退出"/>
        </menu>
    </item>

</menu>

加载函数为:

public boolean onCreateOptionsMenu(Menumenu) {
         getMenuInflater().inflate(R.menu.menu,menu);
         return true;
}
菜单选择事件监听函数为:
public boolean onOptionsItemSelected(MenuItem item) {//菜单选择事件监听
	switch (item.getItemId()){
		case R.id.new_file:
			Toast.makeText(this,"您选择了新建按钮",Toast.LENGTH_SHORT).show();
			break;
		case R.id.open_file:
			Toast.makeText(this,"您选择了打开按钮",Toast.LENGTH_SHORT).show();
			break;
		case R.id.edit_file:
			Toast.makeText(this,"您选择了编辑按钮",Toast.LENGTH_SHORT).show();
			break;
		case R.id.delete_set:
			Toast.makeText(this,"您选择了删除按钮",Toast.LENGTH_SHORT).show();
			break;
		case R.id.exit_set:
			Toast.makeText(this,"您选择了退出按钮",Toast.LENGTH_SHORT).show();
			break;
	}
	return super.onOptionsItemSelected(item);
}
另外,除了以上两个函数外,菜单中比较常用的另外两个函数为:
boolean onMenuOpened(int featureId, Menu menu):菜单打开时被调用;
void onOptionsMenuClosed(Menu menu):菜单关闭的时候被调用;

参考网址:
http://blog.csdn.net/u012702547/article/details/49448031
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/android-sub-menu.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值