多个Fragment的Activity中上下文菜单的处理(ContextMenu)
来源:互联网 发布:r语言编程艺术 编辑:程序博客网 时间:2024/06/04 21:38
在有多个Fragment的Activity中使用上下文菜单时会出现上下文菜单所执行的命令与被执行的对象不一致的问题。比如:在Fragment(或ListFragment)中含有ListView,你給ListView对象注册了上下文菜单。样例代码:[java] view plaincopyListView mListView = (ListView) mRoot.findViewById(R.id.my_listview); mListView.setOnCreateContextMenuListener(this); 在上下文菜单的点击实现方法(onContextItemSelected)中执行菜单操作时你会发现被操作的对象似乎总是第一个Fragment中的那个ListView。或者来回切换Fragment时是上一个Fragment里的ListView。这让人有些沮丧。解决办法:1)在创建上下文菜单时设定不同的组ID(GroupID)。比如:[java] view plaincopy@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { menu.add(this.getDataType(), MENU_EDIT, Menu.NONE, R.string.edit).setIcon(android.R.drawable.ic_menu_edit); menu.add(this.getDataType(), MENU_DELETE, Menu.NONE, R.string.delete).setIcon(android.R.drawable.ic_menu_delete); super.onCreateContextMenu(menu, v, menuInfo); } 上面的menu.add的第一个参数指定组ID,你可以給一个固定值。我的代码中用了已有的this.getDataType(),这是一个抽象方法,子类实现中提供这个ID,此处使用正合适。然后在上下文命令处理方法中对这个组ID进行判断,仅当属于这个组的命令才执行:[java] view plaincopy@Override public boolean onContextItemSelected(MenuItem item) { if (item.getGroupId() == this.getDataType()) { final AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); if (item.getItemId() == MENU_EDIT) { editItem(menuInfo.position); return true; } else if (item.getItemId() == MENU_DELETE) { // ... return true; } } return super.onContextItemSelected(item); } 2)自定义实现ListView的setOnItemLongClickListener处理:[html] view plaincopymListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { final int pos = position; List list = Lists.newArrayList(getResources().getString(R.string.edit), getResources().getString(R.string.delete)); Util.newSimpleSelectionDialog(getActivity(), list, new DialogClickListener() { @Override public void onClick(int index, String element) { if (index == 0) // edit editItem(pos); else if (index == 1) { // delete } } }).show(); return true; } }); 以上两种方法都可很好解决这个问题。至于倾向于哪个解决方法,我觉得自定义方式也不错,尽管需要自定实现菜单显示。参考:http://stackoverflow.com/questions/5297842/how-to-handle-oncontextitemselected-in-a-multi-fragment-activity
0 0
- 多个Fragment的Activity中上下文菜单的处理(ContextMenu)
- 多个Fragment的Activity中上下文菜单的处理(ContextMenu)
- 多个Fragment的Activity中上下文菜单的处理(ContextMenu)
- Android中上下文菜单选项--ContextMenu
- ViewPager+Fragment中上下文菜单点击会顺次响应问题
- Activity嵌套多个fragment时,onResume的处理
- ASP。NET中上下文的制作
- C#中上下文Context的理解
- android中上下文Context的意义
- C#中上下文Context的理解
- android中上下文菜单的创建-----比如长按某个按钮删除数据
- 关于.NET AOP的实现中上下文对象的获取
- 上下文菜单ContextMenu的使用
- 情景菜单ContextMenu的创建
- Delphi7程序中上下文关联chm帮助的实现
- java中上下文(context)的学习总结
- Flask中上下文栈(context stacks)的目的?
- Android 管理多个fragment(处理Activity被回收的情况)
- 非参数估计
- 第十二周项目 3 用递归方法求解(汉诺塔)
- 递进----求二进制
- 在VC中使用自定义资源,FindResource,LoadResource,LockResource
- 关于网狐棋牌6603源码的整理、编译和搭建
- 多个Fragment的Activity中上下文菜单的处理(ContextMenu)
- 第十二周项目2-OJ平台中多输入形式的处理2 分离正整数
- Binary Tree Zigzag Level Order Traversal
- Mapping Coordinates for Drawn Objects(为绘制对象映射坐标)
- c#使用实例之我的c#浏览器
- 中水处理设备:城市中水回用主要途径
- 关于for循环中break和return区别。
- Android编程获取手机型号,本机电话号码,sdk版本及firmware版本号(即系统版本号)
- SET QUOTED_IDENTIFIER OFF是什么意思