android的context menu上下文菜单,长按某一选项,就会显示出来。
SDK上的描述:Context Menu A floating list of menu items that appears when the user performs a long-press on a View.
(一)Standup Timer中的例子
使用步骤
ContextMenu的使用也比较简单和OptionsMenu相似,先添加XML文件,然后重载对应的方法成员。
首先在res文件夹下新建menu目录,然后往里面添加menu的XML 文件。OptionsMenu 和 ContextMenu格式的是一样的。
< menu xmlns:android ="http://schemas.android.com/apk/res/android" >
< item android:id ="@+id/deleteTeam" android:title ="@string/delete"
android:icon ="@android:drawable/ic_menu_delete" />
</ menu >
item:每一个item对应一项菜单。
android:icon:用于指定菜单显示的图标。
android:title:菜单的标题,显示在图标下面。
关于Menu的更多属性设置请查看SDK上的
Menu Resource。
第二步是重写
onCreateContextMenu方法。
代码
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super .onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.meetings_context_menu, menu);
}
接下来是处理菜单的点击事件
代码
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
.getMenuInfo();
switch (item.getItemId()) {
case R.id.delete_meeting:
postionOfMeetingToDelete = info.position;
showDialog(CONFIRM_DELETE_MEETING_DIALOG);
return true ;
default :
return super .onContextItemSelected(item);
}
}
这里我们使用 AdapterContextMenuInfo 来获取上下文菜单 获取对应VIEW 的信息。.position 在这里返回了ListActivity中的位置,
The position in the adapter for which the context menu is being displayed.
注册菜单
ContextMenu和OptionsMenu主菜单不同的是上下文菜单需要使用registerForContextMenu进行注册,否则将无法显示。
代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.teams);
// 将右键菜单注册给List 控件
registerForContextMenu(getListView());
}
(二)我的项目 :移动图书馆 中的例子
通过学习上面的开源项目之后,自由也完善了正在做的项目:
输入关键字进行搜索之后,进去结果显示界面,然后通过对每一个ListView绑定单击监听器和长按截听器(集Context Menu)。
首先第一步,绑定单击监听器:
list = (ListView)findViewById(R.id.mylist);
list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
//通过getItemAtPosition()判断点击的是哪个item,然后强制转化为所某一类型,
//总的来说,如若需要重写ListView中的onListItemClick(即响应该项被单击),获取该具体项时,
//其类型由构造ListView的适配器决定。
HashMap<String,String> t = (HashMap<String,String>) arg0.getItemAtPosition(arg2);
Toast.makeText(getApplicationContext(), t.get("bookName"),Toast.LENGTH_SHORT).show();
}
});
总的来说,如若需要重写ListView中的onListItemClick(即响应该项被单击),获取该具体项时,其类型由构造ListView的适配器决定。我的使用的是SimpleAdapter。
//创建适配器
SimpleAdapter sa = new SimpleAdapter(
this,
booklist,
R.layout.main,
new String [] {"bookName","bookAuthor","press","date","preserveNum","lendableNum","manageNum"} ,
new int [] {R.id.bookmane,R.id.author,R.id.press,R.id.date,R.id.preserve,R.id.lendable,R.id.manage}
);
因为booklist的声明为:List<HashMap<String,String>> booklist;所以上面的t需要强制转化为HashMap<String ,String>类型。
HashMap<String,String> t = (HashMap<String,String>) arg0.getItemAtPosition(arg2);
单击某项时,效果如下:
覆盖以下两个方法:
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.booklist_context, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.buy_book:
Toast.makeText(this, "点击了购书推荐",3000).show();
return true;
case R.id.detail:
Toast.makeText(this, "点击了书籍详细信息",3000).show();
return true;
default:
return super.onContextItemSelected(item);
}
}
最后当然不要忘记了在onCreate()方法中注册:
registerForContextMenu(list);
当长按某一项时效果如下:
选择以上的一个选项时,效果如下: