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

上下文菜单ContextMenu使用案例

前言

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

                         

转变思路

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

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

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

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

源码

// 添加快捷菜单
// 1.重写onCreateContextMenu(Menu menu)的方法,在该方法里调用Menu对象的方法来添加菜单项或子菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
MenuInflater inflater = new MenuInflater(this);
// 装填R.menu.production_info_activity_menu对应的菜单,并添加到menu中
inflater.inflate(R.menu.production_info_activity_menu, menu);
menu.setHeaderTitle("QuickMark");
super.onCreateContextMenu(menu, v, menuInfo);
}

// 2.若希望应用程序能够相应菜单项的单击事件,重写Activity的onContextItemSelected(MenuItem item)方法即可
@Override
public boolean onContextItemSelected(MenuItem item) {
// 得到当前选中的MenuItem的ID,
int item_id = item.getItemId();
// 判断单击的是是哪个菜单项,并有针对性的做出响应
switch (item_id) {
case R.id.PIA_menuitem_fenxiang: {
Intent intent = new Intent(Intent.ACTION_SEND);
//设置分享类型
//intent.setType("image/*");
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "Share");
//好戏在这里!
intent.putExtra(Intent.EXTRA_TEXT,
"#我正在使用“QuickMark”购物评价分享软件(分享自华强APP)#" + product.toString());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(Intent.createChooser(intent, getTitle()));
};break;
case R.id.PIA_menuitem_shuaxin:{}
}
return true;
}

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

     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.production_info_activity);
         // 将快捷菜单注册到商品二维码图片上
        LinearLayout layout = (LinearLayout) findViewById(R.id.PIA_linearLayout);
        registerForContextMenu(layout);
        .....}

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

效果如下图所示:

             

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

注 onCreateContextMenu与onCreateOptionsMenu的区别

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

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

参考文献

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

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

美文美图

时间: 2024-08-05 11:00:29

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

Android进阶(二十六)MenuInflater实现菜单添加

MenuInflater实现菜单添加 前言 之前实现的Android项目中可以实现菜单的显示.但是再次调试项目时发现此功能已无法实现,很是令人费解.难道是因为自己手机Android系统的问题?尝试通过别的手机进行真机调试. 经过在别人的手机上进行测试,发现问题依旧存在.那就是自己的程序有问题了. 实现菜单显示的代码如下: /** * 添加菜单或子菜单 * * 1.重写onCreateOptionsMenu(Menu menu)方法,在该方法里调用Menu对象的方法来添加菜单项或子菜单 */ @O

Android进阶(二十二)设置TextView文字水平垂直居中

设置TextView文字水平垂直居中 有2种方法可以设置TextView文字居中: 一:在xml文件设置:android:gravity="center" 二:在程序中设置:m_TxtTitle.setGravity(Gravity.CENTER); 备注:android:gravity和android:layout_gravity的区别在于前者对控件内部操作,后者是对整个控件操作. 例如:android:gravity="center"是对textView中文字居

Android笔记二十八.Android绘图深度解析

Android绘图深度解析 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) Android绘图方法主要有两个步骤: (1)实现一个继承于View组件的类,并重写它的onDraw(Canavas canvas)方法; (2)显示定义的View子类,有两种方法:a.使用一个Activity来显示View子类,即 setContentView(new MyView(this, null));b.在Acitviy的布局文件中增加"包名.View子类&

Android进阶(二十四)Android UI---界面开发推荐颜色

Android UI---界面开发推荐颜色   在Android开发过程中,总要给app添加一些背景,个人认为使用纯色调便可以达到优雅的视觉效果. 补充一些常用的颜色值:colors.xml <?xml version="1.0" encoding="utf-8" ?> <resources> <color name="white">#ffffff</color><!--白色 --> &

Android进阶(二十五)setTextColor()的参数设置方式

setTextColor()的参数设置方式 查了下资料发现setTextColor()的参数可以写成以下形式: 直接使用颜色值 setTextColor(0xFF0000FF);//0xFF0000FF是int类型的数据,分组一下0x|FF|0000FF,0x是代表颜色整数的标记,ff是表示透明度,0000FF表示颜色,注意:这里0xFF0000FF必须是8个的颜色表示,不接受0000FF这种6个的颜色表示. 使用系统自带的颜色类 setTextColor(android.graphics.Co

AngularJS进阶(二十八)解决AngualrJS页面刷新导致异常显示问题

解决AngualrJS页面刷新导致异常显示问题 绪 俗话说,细节决定成败,编程亦是如此.编程过程中我们可能会不自觉的忽视一些细节问题,殊不知,这些细节正是导致页面显示出现问题的地方.今略举一例,与君共勉之. 页面正常加载后,显示如下: 按F5刷新之后,页面如下所示: 很明显,页面显示出现了异常.回过头再看看Chrome的错误提示, 具体代码如下: 正是以上代码导致了错误的发生. 追根溯源 让我们回顾一下,错误到底是如何发生的.正常加载情况下,页面正常显示很容易理解,程序是按照既定的数据流走的.但

Android项目实战(二十八):Zxing二维码实现及优化

原文:Android项目实战(二十八):Zxing二维码实现及优化 前言: 多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意. 当然,项目中我们也许只会用到二维码的扫描和生成两个功能,所以不必下载完整的jar包,使用简化版的即可,下文可见. 这篇文章讲述:1.如果快速在项目中集成zxing,实现扫描和生成二维码功能 2.根据项目需求去修改源码实现我们的要求并进行优化 一.快速集成zxing二维码 1.下载库文件 : http://do

Bootstrap &lt;基础二十八&gt;列表组

列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 class .list-group-item. 下面的实例演示了这点: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 基本的列表组</title> <link href="/boo

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t