android开发之使用上下文菜单

举报
江南一点雨 发表于 2021/08/17 01:09:07 2021/08/17
【摘要】 android中的上下文菜单类似于PC上的鼠标右键单击,不同的是android上没有鼠标这一概念,更谈不上右键单击,在android中,一般是长按某个View,调出上下文菜单。与OptionsMenu不同的是,ContextMenu是一个针对View的菜单,它绑定在某一个View上,而OptionsMenu是属于一个Activity的。 现在大部分浏览器都有长按复制的功能,...

android中的上下文菜单类似于PC上的鼠标右键单击,不同的是android上没有鼠标这一概念,更谈不上右键单击,在android中,一般是长按某个View,调出上下文菜单。与OptionsMenu不同的是,ContextMenu是一个针对View的菜单,它绑定在某一个View上,而OptionsMenu是属于一个Activity的。


现在大部分浏览器都有长按复制的功能,如下图:


这种效果的实现是使用PopupWindow来实现的(关于PopupWindow的使用可以参见我的另一篇文章popupWindow使用详解
),虽然它和我们即将要说的ContextMenu很像。


好了,说了这么多,我们该说说怎么实现上下文菜单了。

实现上下文菜单一共三个步骤:

1.重写Activity或者Fragment中的onCreateContextMenu方法:


  
  1. @Override
  2. public void onCreateContextMenu(ContextMenu menu, View v,
  3. ContextMenuInfo menuInfo) {
  4. super.onCreateContextMenu(menu, v, menuInfo);
  5. menu.setHeaderTitle("你想干啥?");
  6. menu.setHeaderIcon(R.drawable.a4c);
  7. menu.add(0, 0, Menu.NONE, "复制");
  8. menu.add(0, 1, Menu.NONE, "剪贴");
  9. menu.add(0, 2, Menu.NONE, "重命名");
  10. menu.add(1, 3, Menu.NONE, "去新的Activity");
  11. }


2.重写Activity或者Fragment中的onContextItemSelected方法,实现菜单事件监听


  
  1. @Override
  2. public boolean onContextItemSelected(MenuItem item) {
  3. switch (item.getItemId()) {
  4. case 0:
  5. tv.setText(item.getTitle().toString());
  6. break;
  7. case 1:
  8. tv.setText(item.getTitle().toString());
  9. break;
  10. case 2:
  11. tv.setText(item.getTitle().toString());
  12. break;
  13. case 3:
  14. tv.setText(item.getTitle().toString());
  15. startActivity(new Intent(this, SecondActivity.class));
  16. break;
  17. default:
  18. return super.onContextItemSelected(item);
  19. }
  20. return true;
  21. }

3.给View注册上下文菜单


  
  1. tv = (TextView) this.findViewById(R.id.tv);
  2. this.registerForContextMenu(tv);

三个步骤实现了给一个TextView注册了上下文菜单事件,有时候我们会遇到另外情况,比如说要给ListView中的每一项都添加上下文菜单,而且当我们长按ListView该项的时候,我们还希望能够知道我们点击的是哪一个item,这个该怎么实现呢?AdapterContextMenuInfo专为解决这个问题而生,看看先下面的代码:


  
  1. public class SecondActivity extends Activity {
  2. private ListView lv;
  3. private String[] menuStrs;
  4. private ArrayAdapter<String> adapter;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_second);
  9. lv = (ListView) this.findViewById(R.id.lv);
  10. initListView();
  11. this.registerForContextMenu(lv);
  12. }
  13. private void initListView() {
  14. menuStrs = new String[] { "庆历四年春", "滕子京谪守巴陵郡", "越明年", "政通人和" };
  15. adapter = new ArrayAdapter<String>(this,
  16. android.R.layout.simple_list_item_1, menuStrs);
  17. lv.setAdapter(adapter);
  18. }
  19. @Override
  20. public void onCreateContextMenu(ContextMenu menu, View v,
  21. ContextMenuInfo menuInfo) {
  22. super.onCreateContextMenu(menu, v, menuInfo);
  23. menu.setHeaderTitle("你想干啥?");
  24. menu.setHeaderIcon(R.drawable.a4c);
  25. menu.add(0, 0, Menu.NONE, "岳");
  26. menu.add(0, 1, Menu.NONE, "阳");
  27. menu.add(0, 2, Menu.NONE, "楼");
  28. menu.add(1, 3, Menu.NONE, "记");
  29. }
  30. @Override
  31. public boolean onContextItemSelected(MenuItem item) {
  32. AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item
  33. .getMenuInfo();
  34. switch (item.getItemId()) {
  35. case 0:
  36. menuStrs[menuInfo.position] += "岳";
  37. break;
  38. case 1:
  39. menuStrs[menuInfo.position] += "阳";
  40. break;
  41. case 2:
  42. menuStrs[menuInfo.position] += "楼";
  43. break;
  44. case 3:
  45. menuStrs[menuInfo.position] += "记";
  46. break;
  47. default:
  48. return super.onContextItemSelected(item);
  49. }
  50. adapter.notifyDataSetChanged();
  51. return true;
  52. }
  53. }


实现的效果如下图所示:



Demo下载https://github.com/lenve/contextMenu



文章来源: wangsong.blog.csdn.net,作者:_江南一点雨,版权归原作者所有,如需转载,请联系作者。

原文链接:wangsong.blog.csdn.net/article/details/49448031

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。