博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多个Fragment的Activity中上下文菜单的处理(ContextMenu)
阅读量:3594 次
发布时间:2019-05-20

本文共 2173 字,大约阅读时间需要 7 分钟。

在有多个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

转载地址:http://zwwzn.baihongyu.com/

你可能感兴趣的文章
eclipse常用快捷键
查看>>
html大作业笔记
查看>>
力扣 3. 无重复字符的最长子串
查看>>
力扣617. 合并二叉树
查看>>
力扣461. 汉明距离
查看>>
力扣 7. 整数反转
查看>>
力扣46. 全排列
查看>>
力扣22. 括号生成
查看>>
linux报错:export `xxxxx' not a valid identifier的一般原因
查看>>
linux 编译Java文件 报错 could not create parent directories
查看>>
[解决]VSCode在Linux下导入c语言头文件警告
查看>>
VS Code 编辑文件延迟大,卡顿的解决办法
查看>>
Java中递归的如果想要达到C++的传参效果的一种写法
查看>>
Hadoop在window上运行出现:java.io.IOException: (null) entry in command string: null chmod 0644
查看>>
最小生成树的 Krusal 算法和 Prim 算法 Java 实现
查看>>
CentOS下设置默认JDK
查看>>
剑指offer 43.左旋转字符串
查看>>
剑指offer 47. 求1 + 2 + 3 + .... + n
查看>>
分布式和集群的区别
查看>>
本科毕设完整流程和注意事项
查看>>