上下文菜单就是用户长按组件时弹出的菜单。需要重写Activity的onCreateContextMenu()方法。
先上类图。
1.继承关系:
2.关联关系:
ContextMenu下可以添加SubMenu,也可以直接添加MenuItem。
下面是一个例子。
activity类:
package com.zzj.ui.contextmunedemo;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.widget.Toast;
import com.zzj.ui.R;
import com.zzj.ui.menudemo.OtherActivity;
public class ContextMenuActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contextmenu_activity);
registerForContextMenu(findViewById(R.id.contextmenu_btn));
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
menu.setHeaderTitle("聊天")
.setHeaderIcon(android.R.drawable.ic_menu_call);
menu.add(Menu.NONE, Menu.FIRST + 0, 0, "设为未读");
menu.add(Menu.NONE, Menu.FIRST + 1, 1, "删除");
SubMenu fileMenu = menu.addSubMenu(Menu.NONE, Menu.FIRST + 2, 2, "文件")
.setHeaderIcon(android.R.drawable.ic_menu_edit);
fileMenu.add(Menu.NONE, Menu.FIRST + 20, 0, "打开").setIntent(
new Intent(ContextMenuActivity.this, OtherActivity.class));
fileMenu.add(Menu.NONE, Menu.FIRST + 21, 1, "保存");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case Menu.FIRST + 0:
display("设为未读");
break;
case Menu.FIRST + 1:
display("删除");
break;
case Menu.FIRST + 2:
display("文件");
break;
case Menu.FIRST + 20:
display("打开");
break;
case Menu.FIRST + 21:
display("保存");
break;
default:
break;
}
/*
* 如果返回true,不会再触发MenuItem后面的事件。
*
* 如本例中,点击【打开】菜单项时,不会跳转到另一个Activity。
*
* 实际上就是控制事件传播
*/
return false;
}
@Override
public void onContextMenuClosed(Menu menu) {
display("上下文菜单关闭了");
}
private void display(String message) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show();
}
}
其他代码就免了。
长按组件:
点击【文件】菜单: