您的位置:首页 > 其它

Context Menu的使用+为ListView绑定监听器——开源项目Standup Timer学习总结(二)

2012-06-25 13:49 811 查看
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);
单击某项时,效果如下:







第二步,创建Conttext Menu.

覆盖以下两个方法:

@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);


当长按某一项时效果如下:



选择以上的一个选项时,效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: