多个Fragment的Activity中上下文菜单的处理(ContextMenu)

在有多个Fragment的Activity中使用上下文菜单时会出现上下文菜单所执行的命令与被执行的对象不一致的问题。比如:在Fragment(或ListFragment)中含有ListView,你給ListView对象注册了上下文菜单。样例代码:

[java]  view plain copy
  1. ListView mListView = (ListView) mRoot.findViewById(R.id.my_listview);  
  2. mListView.setOnCreateContextMenuListener(this);  

在上下文菜单的点击实现方法(onContextItemSelected)中执行菜单操作时你会发现被操作的对象似乎总是第一个Fragment中的那个ListView。或者来回切换Fragment时是上一个Fragment里的ListView。这让人有些沮丧。

解决办法:1)在创建上下文菜单时设定不同的组ID(GroupID)。比如:

[java]  view plain copy
  1. @Override  
  2. public void onCreateContextMenu(ContextMenu menu, View v,  
  3.         ContextMenuInfo menuInfo) {  
  4.     menu.add(this.getDataType(), MENU_EDIT, Menu.NONE, R.string.edit).setIcon(android.R.drawable.ic_menu_edit);  
  5.     menu.add(this.getDataType(), MENU_DELETE, Menu.NONE, R.string.delete).setIcon(android.R.drawable.ic_menu_delete);  
  6.     super.onCreateContextMenu(menu, v, menuInfo);  
  7. }  

上面的menu.add的第一个参数指定组ID,你可以給一个固定值。我的代码中用了已有的this.getDataType(),这是一个抽象方法,子类实现中提供这个ID,此处使用正合适。

然后在上下文命令处理方法中对这个组ID进行判断,仅当属于这个组的命令才执行:

[java]  view plain copy
  1. @Override  
  2. public boolean onContextItemSelected(MenuItem item) {  
  3.        if (item.getGroupId() == this.getDataType()) {  
  4.            final AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();  
  5.            if (item.getItemId() == MENU_EDIT) {  
  6.                editItem(menuInfo.position);   return true;  
  7.            }  
  8.            else if (item.getItemId() == MENU_DELETE) {  
  9.                // ... return true;  
  10.            }  
  11.        }  
  12.     return super.onContextItemSelected(item);  
  13. }  

2)自定义实现ListView的setOnItemLongClickListener处理:

[html]  view plain copy
  1. mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {  
  2.     @Override  
  3.     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {  
  4.         final int pos = position;  
  5.         List<String> list = Lists.newArrayList(getResources().getString(R.string.edit), getResources().getString(R.string.delete));  
  6.         Util.newSimpleSelectionDialog(getActivity(), list,  
  7.                 new DialogClickListener<String>() {  
  8.                     @Override  
  9.                     public void onClick(int index, String element) {  
  10.                         if (index == 0)  // edit  
  11.                             editItem(pos);  
  12.                         else if (index == 1) {  // delete  
  13.                         }  
  14.                     }  
  15.                 }).show();  
  16.         return true;  
  17.     }  
  18. });  

以上两种方法都可很好解决这个问题。至于倾向于哪个解决方法,我觉得自定义方式也不错,尽管需要自定实现菜单显示。

参考:http://stackoverflow.com/questions/5297842/how-to-handle-oncontextitemselected-in-a-multi-fragment-activity

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值