上下文菜单和Contextual Action Mode(学习Android Programming The Big Nerd Ranch Guide)

在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接口的实例。

你可能感兴趣的:(programming)