>> ContextMenu是android的context menu上下文菜单,选择某项VIEW后长按menu键,就会显示出来。比如EditeText就可以通过长按来弹出拥有“cut”,"copy","paste"等项的ContextMenu。
实现ContextMenu,一般要用到以下三个方法:
(1)registerForContextMenu(getExpandableListView());
(2)onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo);
(3)onContextItemSelected(MenuItem item);
尽管上下文菜单的拥有者是View,生成上下文菜单却是通过Activity中的onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo)方法,该方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法。两者的不同在于,onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按View时被调用,而且View必须已经注册了上下文菜单。
另一个值得注意的就是上图中的ContextMenuInfo,该类的对象被传入onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo)方法,那么它有什么用呢?有时候,视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的ID等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。
下面的例子是使用菜单(menu)资源,当然有两种方式,第一种是在布局文件中定义,另一种是在代码中实现。下面先说第一种。
项目截图:
1.实现ContextMenu(上下文菜单)
a)首先在布局文件main.xml中定义一个TextView,作为菜单 测试资源
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="测试菜单资源" /> </LinearLayout>
b).在res/menu目录下面创建文件菜单资源file_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:title="File" > <menu> <group android:id="@+id/noncheckable_group" android:checkableBehavior="none" > <item android:id="@+id/newFile" android:title="New" android:alphabeticShortcut="n" /> <item android:id="@+id/openFile" android:title="Open" android:alphabeticShortcut="o" /> <item android:id="@+id/saveFile" android:title="Save" android:alphabeticShortcut="s" /> </group> </menu> </item> <item android:title="Edit" > <menu> <group android:id="@+id/edit_group" android:checkableBehavior="single" > <item android:id="@+id/cut" android:title="Cut" /> <item android:id="@+id/copy" android:title="Copy" /> <item android:id="@+id/past" android:title="paste" /> </group> </menu> </item> <item android:title="Help" > <menu> <group android:id="@+id/help_group" > <item android:id="@+id/about" android:title="About" /> <item android:id="@+id/exit" android:title="Exit" /> </group> </menu> </item> </menu>
c)在Activity中实现ContextMenu,按照前面的理论指导,代码实现如下:
package com.xzy.menu.demo; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.widget.TextView; public class TestMenuActivity extends Activity { private MenuInflater mi; private TextView textview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textview = (TextView) findViewById(R.id.textview); registerForContextMenu(textview); //上下文菜单必需使用该方法注册 } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub mi = new MenuInflater(this); mi.inflate(R.menu.file_menu, menu); } @Override // 菜单项的单击事件 public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.about: aboutAlert("本实例演示的是如何使用xml菜单资源来定义菜单!"); break; case R.id.exit: exitAlert("真的要退出么?"); break; } return true; } // 显示对话框 private void exitAlert(String msg) { // 实例化AlertDialog.Builder AlertDialog.Builder builder = new AlertDialog.Builder(this); // 设置显示信息 builder.setMessage(msg).setCancelable(false) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // 结束activity finish(); } // 取消按钮 }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { return; } }); // 创建对话框 AlertDialog alert = builder.create(); // 显示对话框 alert.show(); } // 显示对话框 private void aboutAlert(String msg) { // 实例化AlertDialog.Builder AlertDialog.Builder builder = new AlertDialog.Builder(this); // 设置显示信息 builder.setMessage(msg).setCancelable(false) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); // 创建对话框 AlertDialog alert = builder.create(); // 显示对话框 alert.show(); } }
此时运行程序,长按文本内容就可以呼出上下文菜单。效果如图:
2.实现OptionsMenu(子菜单)的话,需要重写下面的几个方法,而且此时不需要注册。用手机系统按键呼出
前面定义的布局文件不需要改动,java代码如下:
package com.xzy.menu.demo; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ContextMenu.ContextMenuInfo; import android.widget.TextView; public class TestMenuActivity extends Activity { private MenuInflater mi; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } // 覆盖Activity的onCreateOptionsMenu()方法,在其中创建菜单 public boolean onCreateOptionsMenu(Menu menu) { // 调用MenuInflater的inflate方法,通过配置文件创建菜单 mi = new MenuInflater(this); mi.inflate(R.menu.file_menu, menu); return true; } @Override // 菜单项的单击事件 public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.about: aboutAlert("本实例演示的是如何使用xml菜单资源来定义菜单!"); break; case R.id.exit: exitAlert("真的要退出么?"); break; } return true; } // 显示对话框 private void exitAlert(String msg) { // 实例化AlertDialog.Builder AlertDialog.Builder builder = new AlertDialog.Builder(this); // 设置显示信息 builder.setMessage(msg).setCancelable(false) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // 结束activity finish(); } // 取消按钮 }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { return; } }); // 创建对话框 AlertDialog alert = builder.create(); // 显示对话框 alert.show(); } // 显示对话框 private void aboutAlert(String msg) { // 实例化AlertDialog.Builder AlertDialog.Builder builder = new AlertDialog.Builder(this); // 设置显示信息 builder.setMessage(msg).setCancelable(false) .setPositiveButton("确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }); // 创建对话框 AlertDialog alert = builder.create(); // 显示对话框 alert.show(); } }
子菜单效果图:
用java代码实现的例子:
参见博文:http://blog.csdn.net/pfgmylove/article/details/7560290?reload