Android 上下文菜单(Context Menu)

一、概述

  Android中,上下文菜单是通过onLongClick(...)事件访问的。在事件触发后显示菜单项。

  在使用上下文菜单时,通常在onCreate(...)方法中,先行注册上下文菜单。在实现onCreateContextMenu(...)方法和onContextItemSelected(...)方法。

  注册菜单方法:registerForContextMenu(...)

  注销注册菜单方法:unregisterForContextMenu(...)

二、使用XML文件添加上下文菜单

  text_menu.xml上下文菜单选项:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <menu xmlns:android="http://schemas.android.com/apk/res/android">
 3     <item android:title="File">
 4         <menu>
 5             <group android:checkableBehavior="none">
 6                 <item android:id="@+id/file_new"
 7                       android:title="New"
 8                       android:icon="@android:drawable/ic_input_add"
 9                       android:alphabeticShortcut="n" />
10                 <item android:id="@+id/file_save"
11                       android:title="Save"
12                       android:icon="@android:drawable/ic_menu_save"
13                       android:alphabeticShortcut="s" />
14             </group>
15         </menu>
16     </item>
17     <item android:title="Edit">
18         <menu>
19             <!-- 单选按钮组 -->
20             <group android:checkableBehavior="single">
21                 <item android:id="@+id/cut"
22                       android:title="Cut"
23                       android:alphabeticShortcut="Ctrl + x" />
24                 <item android:id="@+id/copy"
25                       android:title="Copy"
26                       android:alphabeticShortcut="Ctrl + c" />
27                 <item android:id="@+id/paste"
28                       android:title="Paste"
29                       android:alphabeticShortcut="Ctrl + v" />
30             </group>
31         </menu>
32     </item>
33 </menu>

  在代码中,添加上下文菜单显示,及在选择上下文菜单项时触发事件(MainActivity.java):

 1 public class MainActivity extends Activity
 2 {
 3     private static final String TAG = "MainActivity";
 4     private Context mContext;
 5     private EditText mEditMenu;
 6     private MenuInflater mMenuInflater;
 7
 8     @Override
 9     public void onCreate(Bundle savedInstanceState)
10     {
11         super.onCreate(savedInstanceState);
12         setContentView(R.layout.activity_main);
13
14         mContext = getApplicationContext();
15
16         // 绑定菜单按钮事件
17         mEditMenu = (EditText) findViewById(R.id.input_text3);
18         // 注册上下文菜单
19         registerForContextMenu(mEditMenu);
20     }
21
22     // 上下文菜单,与EditView控件绑定,长按显示菜单项
23     @Override
24     public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo)
25     {
26         super.onCreateContextMenu(menu, view, contextMenuInfo);
27         // 创建新的contextMenu对象
28         mMenuInflater = new MenuInflater(this);
29         // 使用XML与原menu对象对新ContextMenu对象初始化
30         mMenuInflater.inflate(R.menu.text_menu, menu);
31     }
32
33     // 上下文菜单,触发上下文菜单项点击事件时响应
34     @Override
35     public boolean onContextItemSelected(MenuItem item)
36     {
37         switch (item.getItemId())
38         {
39             case R.id.file_new:
40             {
41                 Toast.makeText(mContext, "File new.", Toast.LENGTH_SHORT).show();
42                 break;
43             }
44             case R.id.file_save:
45             {
46                 Toast.makeText(mContext, "File save.", Toast.LENGTH_SHORT).show();
47                 break;
48             }
49             case R.id.cut:
50             {
51                 Toast.makeText(mContext, "Edit cut.", Toast.LENGTH_SHORT).show();
52                 break;
53             }
54             case R.id.copy:
55             {
56                 Toast.makeText(mContext, "Edit copy.", Toast.LENGTH_SHORT).show();
57                 break;
58             }
59             case R.id.paste:
60             {
61                 Toast.makeText(mContext, "Edit paste.", Toast.LENGTH_SHORT).show();
62                 break;
63             }
64             default:
65                 Toast.makeText(mContext, "无响应", Toast.LENGTH_SHORT).show();
66         }
67         return true;
68     }
69
70     // 注销注册过的上下文菜单
71     @Override
72     public void onDestroy()
73     {
74         super.onDestroy();
75         unregisterForContextMenu(mEditMenu);
76     }
77 }

  PS:ContextMenu的任何项在被选中后,整个ContextMenu会自动被系统关闭掉,即使多选项也是这样。这样的话,多选项的行为就有些怪异。查看Android的源码后,发现这是个Android的bug,应该是google没考虑多选项的情况。

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

时间: 2024-08-28 21:30:19

Android 上下文菜单(Context Menu)的相关文章

上下文菜单Context Menu如何实现点击事件

代码如下: TextView txtView = (TextView)findViewById(R.id.image); registerForContextMenu(txtView); txtView.setOnClickListener(new View.OnClickListener() { @Override void onClick(View v) { // TODO Auto-generated method stub v.showContextMenu(); } }); 重写方法:

android 上下文菜单详解

本文使用xml来创建上下文菜单 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/add" android:title="添加" android:orderInCategor

Android上下文菜单ContentView详解

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

Android上下文菜单

package com.bawei.d4; import java.util.ArrayList;import java.util.List; import android.os.Bundle;import android.app.Activity;import android.content.Intent;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuItem;import an

Android 上下文菜单实现

1.覆盖Activity的onCreateContenxtMenu()方法,调用Menu的add方法添加菜单项(MenuItem). 2.覆盖Activity的onContextItemSelected()方法,响应上下文菜单菜单项的单击事件. 3.调用registerForContextMenu()方法,为视图注册上下文菜单. JAVA代码: packageEOE.local.contextMenu; importandroid.app.ListActivity; importandroid.

Android 上下文菜单 悬浮式

可以在每个View控件上注册一个长按点击事件,触发弹出一个悬浮的菜单,也成为上下文菜单 菜单视图部分 xml <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto&q

Android 选项菜单Options Menu

一般的手机上都会有一个home键,单击后会显示出一系列的菜单,这个即是选项菜单(Options Menu),Options Menu开发主要涉及Menu,MenuItem,Submenu. 1.一个Menu对象代表一个菜单,Menu对象可以添加MenuItem,也可以添加子菜单Submenu: 2.MenuItem 对象代表一个菜单选项,通常MenuItem实例通过Menu.add()方法添加. menu.add(int group_id,int item_id,int order,CharSe

Android 选项菜单Option Menu 使用

每个Activity都可以有至多一个选项菜单 菜单的视图文件最好在res下再新建一个目录存放,菜单视图文件名就是一个菜单资源标识 选项菜单的创建和使用 xml部分 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas

Android进阶(二十八)上下文菜单ContextMenu使用案例

上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等操作,但是现在此操作莫名其妙的消失了.写了个测试Demo,如中图所示,一切按照逻辑显示正常.怪就怪在项目中无法显示,起初设想是因为Android系统版本太高问题,但是在别的手机上测试之后发现问题依旧存在.难道是因为顶部Tab标题栏遮挡住了选项菜单的显示?继续测试,通过在别的没有Tab标题栏的页面测试选项菜单,