在Android Programming The Big Nerd Ranch Guide书中,讲解上下文菜单的实现,添加一个删除菜单。
在Honeycomb发布前的设备里,上下文的action都是以悬浮的上下文菜单形式呈现。在之后的设备里,推荐用上下文的action bar的方式去呈现上下文的action。上下文的action bar展现在一个activity的顶部。
运行在Honeycomb之前版本的程序,有些也会出现上下文action bar。那是因为它使用了第三方库,这个库名字是ActionBarSherlock。
一、实现悬浮的上下文菜单
1、用XML定义”删除菜单”资源文件。
2、实现onCreateContextMenu(………)方法,用它来inflate菜单资源文件。
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { getActivity().getMenuInflater().inflate(R.menu.crime_list_item_context, menu); }3、要在onCreateView中注册这个context menu。
ListView listView = (ListView)view.findViewById(android.R.id.list); registerForContextMenu(listView);
4、最后在实现onContextItemSelected(MenuItem item)方法,来处理删除菜单被点击的事件。
二、兼容上下文action bar菜单
1、修改onCreateView中对于context menu的注册。
ListView listView = (ListView)view.findViewById(android.R.id.list); if(Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB){ registerForContextMenu(listView); }else{ listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); }
ListView.CHOICE_MODE_MULTIPLE_MODAL是listview多选模式。
在悬浮的上下文菜单中,一次只能选择一个item,activity会在选择后被覆盖进入Paused状态,很不方便。
而在这种contextual action bar 菜单模式下,可以一次选多个item。
2、为listview设置一个监听器。需要实现AbsListView.MultiChoiceModeListener接口。
这个接口中包含一个方法:
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked)
它会在item被选中和取消选中后响应。
MultiChoiceModeListener还实现了另一个接口ActionMode.Callback,它包含四个方法,分别在ActionMode生命周期的不同阶段回调。
public boolean onCreateActionMode(ActionMode mode, Menu menu) public boolean onPrepareActionMode(ActionMode mode, Menu menu) public boolean onActionItemClicked(ActionMode mode, MenuItem item) public void onDestroyActionMode(ActionMode mode)
可以在onCreateActionMode方法中inflate菜单的资源文件。在这个方法中也可以设置此时的title。
可以在onActionItemClicked方法中设置点击删除菜单项后所触发的事件。
Contextual action mode不仅可以在ListView中实现,也可以在其他的view,如GirdView实现。
如果既不是ListView,也不是GirdView,也是可以实现的。需要实现一个接口,View.OnLongClickListener。在实现这个接口时,可以通过
Acitivty.startActionMode(…..)方法来创建一个 ActionMode实例,这个方法的唯一参数是ActionMode.CallBack接口的实例。