Android进阶(二十八)上下文菜单ContextMenu使用案例

上下文菜单ContextMenu使用案例

前言

      回顾之前的应用程序,发现之前创建的选项菜单无法显示了。按照正常逻辑来说,左图中在“商品信息”一栏中应该存在选项菜单,用户可进行分享等操作,但是现在此操作莫名其妙的消失了。写了个测试Demo,如中图所示,一切按照逻辑显示正常。怪就怪在项目中无法显示,起初设想是因为Android系统版本太高问题,但是在别的手机上测试之后发现问题依旧存在。难道是因为顶部Tab标题栏遮挡住了选项菜单的显示?继续测试,通过在别的没有Tab标题栏的页面测试选项菜单,发现依旧无法显示,如右图所示。这样问题就变得更加棘手了。难道是因为项目整体设置问题,这方面的原因很大,不过由于问题根源不明确,所以修改也存在一定的难度。

                              

转变思路

     既然通过选项菜单无法完成操作,通过阅读书籍得知还存在另外两种形式的菜单:子菜单(submenu)、快捷菜单(context menu),尝试新建context menu解决问题。

     快捷菜单类似于计算机程序中的“右键菜单”,当用户点击界面上某个元素超过2秒后,将启动注册到该界面元素的快捷菜单。快捷菜单同样采用浮动的显示方式,虽然快捷菜单的显示方式与子菜单相同,但两种菜单的启动方式却截然不同。

     快捷菜单的使用方法与选项菜单极为相似,只是重载的函数不同而已。快捷菜单需要重载onCreatContextMenu()函数初始化菜单项,包括添加快捷菜单所显示的标题、图标和菜单子项等内容。

     有关选项菜单的创建代码,详见博文《Android进阶(二十六)MenuInflater实现菜单添加》,在此不再展示。

源码

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. // 添加快捷菜单  
  2. // 1.重写onCreateContextMenu(Menu menu)的方法,在该方法里调用Menu对象的方法来添加菜单项或子菜单  
  3. @Override  
  4. public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {  
  5. MenuInflater inflater = new MenuInflater(this);  
  6. // 装填R.menu.production_info_activity_menu对应的菜单,并添加到menu中  
  7. inflater.inflate(R.menu.production_info_activity_menu, menu);  
  8. menu.setHeaderTitle("QuickMark");  
  9. super.onCreateContextMenu(menu, v, menuInfo);  
  10. }  
  11.    
  12. // 2.若希望应用程序能够相应菜单项的单击事件,重写Activity的onContextItemSelected(MenuItem item)方法即可  
  13. @Override  
  14. public boolean onContextItemSelected(MenuItem item) {  
  15. // 得到当前选中的MenuItem的ID,  
  16. int item_id = item.getItemId();  
  17. // 判断单击的是是哪个菜单项,并有针对性的做出响应  
  18. switch (item_id) {  
  19. case R.id.PIA_menuitem_fenxiang: {  
  20. Intent intent = new Intent(Intent.ACTION_SEND);  
  21. //设置分享类型  
  22. //intent.setType("image/*");  
  23. intent.setType("text/plain");  
  24. intent.putExtra(Intent.EXTRA_SUBJECT, "Share");  
  25. //好戏在这里!  
  26. intent.putExtra(Intent.EXTRA_TEXT,  
  27. "#我正在使用“QuickMark”购物评价分享软件(分享自华强APP)#" + product.toString());  
  28. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  29. startActivity(Intent.createChooser(intent, getTitle()));  
  30. };break;  
  31. case R.id.PIA_menuitem_shuaxin:{}  
  32. }  
  33. return true;  
  34. }  

     将快捷菜单注册到界面中的某一控件代码如下:

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. public void onCreate(Bundle savedInstanceState) {  
  2.    super.onCreate(savedInstanceState);  
  3.    setContentView(R.layout.production_info_activity);  
  4.     // 将快捷菜单注册到商品二维码图片上  
  5.    LinearLayout layout = (LinearLayout) findViewById(R.id.PIA_linearLayout);  
  6.    registerForContextMenu(layout);  
  7.    .....}  

      其中,R.id.PIA_linearLayout为整体线性布局的ID。

      效果如下图所示:

             

      至此,快捷菜单创建完毕。

注 onCreateContextMenu与onCreateOptionsMenu的区别

      onCreateOptionsMenu函数仅在第一次使用菜单时被调用一次;

      onCreateContextMenu函数在每次启动都将会被调用一次。

参考文献

      1.《Android应用程序开发 第二版》

      2.http://www.2cto.com/kf/201309/247051.html

美文美图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值