onContextItemSelected 与 onMenuItemSelected 的那些事

本文深入探讨了Android中五个关键菜单事件处理方法:onCreateOptionsMenu、onCreateContextMenu、onMenuItemSelected、onOptionsItemSelected和onContextItemSelected。通过实例展示了如何在不同场景下灵活应用这些方法,避免菜单事件冲突,并提供了实例代码帮助开发者解决实际问题。

Android 的activity中onCreateOptionsMenu onMenuItemSelected onOptionsItemSelected onCreateContextMenu onContextItemSelected 五个方法的使用:

onCreateOptionsMenu :此方法为创建菜单方法,这个菜单就是你在点击手机menu键时会看到的菜单。

onCreateContextMenu :此方法为创建菜单方法,你还需要对此菜单进行注册Activity.registerForContextMenu(View view),这个菜单是在你长按前面注册的view时看到的菜单。

onMenuItemSelected :当你选择上面两种菜单任意一种时都会触发这个事件。

onOptionsItemSelected :这个方法只在onCreateOptionsMenu 创建的菜单被选中时才会被触发。

onContextItemSelected :这个方法只在onCreateContextMenu 创建的菜单被选中时才会被触发。


/*因为在一个Activity中都使用onMenuItemSelected和onContextItemSelected时会冲突,
也就是说,当有长按弹出菜单的时候,点击菜单的选项响应的是onMenuItemSelected(),如果被
点击的Item Id不在 onMenuItemSelected中,事件就不会响应,此时不会再调用onContextItemSelected。
这样的话,我们在onContextItemSelected中定义的事件就不会执行,这就是很多人遇到的“onContextItemSelected失效”的原因.
这个时候,需要在onContextItemSelected做相应的判断,如果执行的事件不在onMenuItemSelected中,就执行onContextItemSelected。
*/


	@Override
	public boolean onMenuItemSelected(int featureId, MenuItem item) {
		switch (item.getItemId()) {

		case R.id.about:
			Intent intent = new Intent();
			intent.setClass(BaseActivity.this, AboutActivity.class);
			startActivity(intent);
			return true;

		case R.id.bgsettings:
			Intent changeBgIntent = new Intent();
			changeBgIntent.setClass(BaseActivity.this, BgActivity.class);
			startActivity(changeBgIntent);
			return true;

		case R.id.help:
			Intent helpIntent = new Intent();
			helpIntent.setClass(BaseActivity.this, HelpActivity.class);
			startActivity(helpIntent);
			return true;

		case R.id.exit:
			System.exit(0);
			return true;
			
		/*因为在一个Activity中都使用onMenuItemSelected和onContextItemSelected时会冲突,
		也就是说,当有长按弹出菜单的时候,点击菜单的选项响应的是onMenuItemSelected(),如果被
		点击的Item Id不在 onMenuItemSelected中,事件就不会响应,此时不会再调用onContextItemSelected。
		这样的话,我们再onContextItemSelected中定义的事件就不会执行,这就是很多人遇到的“onContextItemSelected失效”的原因.
		这个时候,需要在onContextItemSelected做相应的判断,如果执行的事件不在onMenuItemSelected中,就执行onContextItemSelected。
		*/
		default:
			onContextItemSelected(item);

		}
		return false;
	}
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		System.out.println("--------onContextItemSelected---------");
		switch (item.getItemId()) {
		case R.id.collect_book:
			doCollect();
			return true;
		case R.id.detail:
			Toast.makeText(this, "书籍详细信息", 3000).show();
			return true;
		default:
			return super.onContextItemSelected(item);
		}
	}

其他参考: http://www.cnblogs.com/carbs/archive/2012/07/10/2585241.html
### 安卓菜单的实现相关信息 安卓设备自 Android 3.0 起不再提供物理菜单键,取而代之的是通过软件实现的菜单功能[^2]。这种变化使得开发者能够更加灵活地设计应用程序中的交互体验。 #### 上下文菜单 (Contextual Menu) 上下文菜单是一种针对特定内容的操作集合,通常可以通过长按某项内容触发。其主要用途是在用户选定某些项目后显示可用操作列表。以下是创建上下文菜单的关键步骤: 1. **注册视图以支持上下文菜单** 使用 `registerForContextMenu(View view)` 方法将指定视图绑定到上下文菜单上。 2. **定义上下文菜单的内容** 实现 `onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)` 方法,在其中添加具体的菜单项。 3. **处理菜单点击件** 处理用户的菜单选择行为需重写 `onContextItemSelected(MenuItem item)` 方法。 示例代码如下: ```java @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = findViewById(R.id.text_view); registerForContextMenu(textView); // 注册上下文菜单 } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getMenuInflater().inflate(R.menu.context_menu, menu); // 加载菜单资源文件 } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_edit: editItem(); return true; case R.id.action_delete: deleteItem(); return true; default: return super.onContextItemSelected(item); } } ``` #### 工具栏 (Toolbar) 中的菜单 工具栏 (`Toolbar`) 是现代安卓应用中常用的组件之一,用于替代传统的 ActionBar 并提供更多定制化选项。`Toolbar` 的菜单项可通过 XML 文件定义,并在运行时动态加载和响应。 当设置 Toolbar 的菜单监听器时,会调用 `setOnMenuItemClickListener()` 方法并最终传递给 `Window.Callback` 接口实例的方法 `onMenuItemSelected(int featureId, MenuItem item)` 进行进一步处理[^3]。 示例代码展示如何配置 Toolbar 及其实现菜单逻辑: ```java Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // 设置菜单项点击监听器 toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { openSettings(); // 打开设置页面 return true; } else if (id == R.id.action_search) { performSearch(); // 执行搜索操作 return true; } return false; // 如果未匹配任何 ID,则返回默认值 } }); ``` #### 动态打印文档的功能扩展 除了常规的应用内菜单外,Android 提供了一种便捷的方式来实现文档打印功能。这允许开发人员利用系统的打印框架完成复杂任务而不必重新发明轮子[^4]。具体实现可参考官方指南链接提供的详细说明。 --- ###
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值