原创 menu.addIntentOptions 添加动态菜单 收藏
android的一个activity可以再选中某项之后按menu键弹出特定的菜单,也就是动态菜单。动态菜单的实现是靠menu类中的addIntentOptions函数实现的,具体的声明如下:
int android.view.Menu.addIntentOptions(
int groupId,
int itemId,
int order,
ComponentName caller,
Intent[] specifics,
Intent intent,
int flags,
MenuItem[] outSpecificItems)
这个函数是用来动态产生option menu的
函数参数分析:
1. groupid 就是菜单组的编号;
2. itemId (可以让其为0)
3. order 菜单顺序,可以不考虑
4. Caller 就是发起activity的activity
5. Specifics 以action+uri的具体方式来增加激活相应activity的菜单项
6. Intent 以categroy+uri这种一般形式来增加激活相应activity的菜单项
参数Intent和Specifics的区别是,一个用categroy+uri来匹配activity,一个用action+uri来匹配activity。
8. outSpecificItems 这个是返回的MenuItem值,对应以specifics方式匹配的菜单项。
下面以android sdk中notepad的例子来说明其用法。
来看这个例子中的NotesList.java文件中的public boolean onPrepareOptionsMenu(Menu menu)函数,这个函数会在设定普通option menu菜单项的的onCreateOptionsMenu函数之后调用,这个函数的主要部分是如下代码:
view plaincopy to clipboardprint?
1. Uri uri = ContentUris.withAppendedId(getIntent().getData(), getSelectedItemId());
2.
3.
4. Intent[] specifics = new Intent[1];
5. specifics[0] = new Intent(Intent.ACTION_EDIT, uri);
6. MenuItem[] items = new MenuItem[1];
7.
8.
9. Intent intent = new Intent(null, uri);
10. intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
11. menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0, null, specifics, intent, 0,
12. items);
Uri uri = ContentUris.withAppendedId(getIntent().getData(), getSelectedItemId()); Intent[] specifics = new Intent[1]; specifics[0] = new Intent(Intent.ACTION_EDIT, uri); MenuItem[] items = new MenuItem[1]; Intent intent = new Intent(null, uri); intent.addCategory(Intent.CATEGORY_ALTERNATIVE); menu.addIntentOptions(Menu.CATEGORY_ALTERNATIVE, 0, 0, null, specifics, intent, 0, items);
其中ContentUris.withAppendedId(getIntent().getData(), getSelectedItemId())会得到选中项的信息,这个信息将会作用匹配用的intent的
data部分。
specifics[0] = new Intent(Intent.ACTION_EDIT, uri)在这里是这个意思:到androidMenifest.xml中去找activity, 如果有某个activity的<intent- filter>项的action和data与Intent.ACTION_EDIT和相应的uri匹配,就为这个activity添加一个菜单项,菜单项的显示名称从相应activity的
android:label项得来。
Intent intent = new Intent(null, uri);
intent.addCategory(Intent.CATEGORY_ALTERNATIVE);
是这个意思:到androidMenifest.xml中去找activity,如果有某些activity的<intent-filter>项的Category和data与
Intent.CATEGORY_ALTERNATIVE和相应的uri匹配,就为这些activity分别添加菜单项,菜单项的显示名称从相应activity的android:label项
得来。
下面可以做个试验,在AndroidMenifest.xml中新建一个activity MyAdd
view plaincopy to clipboardprint?
1. <activity android:name="MyAdd" android:label="@string/title_myadd" android:windowsoftinputmode="stateVisible">
3. <intent-filter android:label="@string/resolve_myadd">
4. <action android:name="com.android.notepad.action.MYADD"></action>
5. <category android:name="android.intent.category.ALTERNATIVE"></category>
6. <data android:mimetype="vnd.android.cursor.item/vnd.google.note"></data>
7. </intent-filter>
8. </activity><activity android:name="MyAdd" android:label="@string/title_myadd" android:windowsoftinputmode="stateVisible"><intent-filter android:label="@string/resolve_myadd"><action android:name="com.android.notepad.action.MYADD"></action><category android:name="android.intent.category.ALTERNATIVE"></category><data android:mimetype="vnd.android.cursor.item/vnd.google.note"></data></intent-filter></activity>
写好该activity的layout和实现后,选中noteslist中的一项后,点menu可以看到菜单中多出了一项,点击可以切换到该activity。
这是以函数中Intent匹配的菜单项,当然也可以用Specifics来匹配。下面示例:
删除掉MyAdd这个activity中的 <category android:name="android.intent.category.ALTERNATIVE"></category>,这时该activity已经与Intent不匹配了,
再将onPrepareOptionsMenu函数中的代码改成如下:
view plaincopy to clipboardprint?
1. Intent[] specifics = new Intent[2];
2. specifics[0] = new Intent(Intent.ACTION_VIEW, uri);
3. specifics[1] = new Intent("com.android.notepad.action.MYADD",uri);
4. MenuItem[] items = new MenuItem[2];
Intent[] specifics = new Intent[2]; specifics[0] = new Intent(Intent.ACTION_VIEW, uri); specifics[1] = new Intent("com.android.notepad.action.MYADD",uri); MenuItem[] items = new MenuItem[2];
选中一项点菜会发现,动态菜单又回来了,不过这次是用Specific来匹配的。</intent-filter></intent->
分享到:
相关推荐
在实际应用中,可以根据需求灵活使用这三种菜单类型,以及通过Intent实现动态添加菜单项。同时,通过菜单分组(`setGroupCheckable`, `setGroupEnabled`, `setGroupVisible`)可以方便地管理大量菜单项的属性,提高...
"永宏PLC与台达VFD-M变频器RTU通讯程序的极致体验:简单上手,功能强大,附教程和全套配套程序",永宏plc和台达vfd-m变頻器modbs rtu通讯程序史上最好用的plc和变頻器rtu通讯程序,甩三菱bd板通讯几条街了,程序简单易用,好上手功能强大,控制监视效果可以看视频,说走就走。 使用的是永宏fbs-20mct plc,A,B,N系列也都支持。 内容包含plc和威纶通触摸屏程序,变頻器参数设置和通讯接线,plc程序有注释,关键还有三集的教程送 ,永宏PLC;台达VFD-M变频器;Modbus RTU通讯程序;易用性;功能强大;控制监视;视频教程;永宏FBS-20MCT PLC;A、B、N系列支持;威纶通触摸屏程序;变頻器参数设置;通讯接线;教程。,永宏PLC与台达VFD-M变频器RTU通讯程序:易用强大,监控无难事
"智能电网中配电网孤岛划分与故障重构策略研究",配电网孤岛划分及故障重构 ,配电网孤岛划分; 故障重构; 电力系统稳定性; 能源管理优化; 智能算法应用。,"智能配电网孤岛划分与故障重构策略研究"
EPSON机械手与相机TCP/IP协议协同操作及PLC通讯映射触摸屏实现自动化控制,EPSON机械手跟相机搭配走tcp ip协议,及跟plc通讯将手动操作部分映射到触摸屏 ,核心关键词:EPSON机械手; 相机搭配; TCP/IP协议; PLC通讯; 手动操作; 触摸屏映射。,"EPSON机械手与相机TCP/IP通信,手动操作映射至触摸屏的PLC通讯方案"
伺服电机PLC控制案例程序详解:从基础到实践的全方位指南,伺服电机控制伺服电机案例程序整套伺服电机PLC程… ,核心关键词:伺服电机控制; 案例程序; 整套伺服电机; PLC程序; 伺服电机案例。,"伺服电机控制案例:完整程序与PLC工程实践"
Matlab主动配电网优化重构程序:基于牛顿拉夫逊法的仿真实现与最优电源接入位置研究,matlab主动配电网优化重构程序 牛顿拉夫逊法的Matlab仿真程序 以网损费用最低作为目标函数,也可以改为其他目标,最终计算出最优电源接入位置,实现配电网的优化重构 有专门的文档说明和程序注释,好理解好上手 ,核心关键词:Matlab; 主动配电网优化重构程序; 牛顿拉夫逊法仿真; 网损费用最低目标函数; 最优电源接入位置; 配电网优化重构; 文档说明; 程序注释。,"MATLAB实现主动配电网优化重构:牛顿拉夫逊法仿真及多目标优化研究"
RCC电路间歇振荡的研究资料
高清电视音频解码的定点DSP 实现
字典树的内存优化策略.pdf
西门子SMART触摸屏与两大变频器Modbus通讯实现多功能控制及数据读取文档(附详细程序与源程序文件),西门子SMART触摸屏与2台变频器通讯,通过modbus rtu与三菱FR-D700、台达MS300变频器通讯,实现正反转控制、频率设定,读取输出频率、输出电压、输出电流,有详细的程序说明和源程序文件,文档使用云笔记整理撰写 ,西门子SMART触摸屏; Modbus RTU通讯; 变频器控制; 频率设定; 输出参数读取; 程序说明; 源程序文件; 云笔记整理撰写,西门子SMART触摸屏三变频器通讯控制方案及源码详解
全国标准化知识竞赛试题库(含参考答案).pptx
BLDC控制器创新设计方案揭秘:高效能、智能化控制策略实践,BLDC控制器设计方案 ,核心关键词:BLDC控制器; 设计方案; 驱动算法; 控制系统; 性能优化; 可靠性设计; 安全性设计; 调试与测试; 通信协议; 硬件与软件整合。,基于BLDC电机的控制器设计新思路
计算两个相机相对位姿(1).py
BLDC无刷直流驱动控制板:驱动300W电机,功能丰富,含霍尔传感器,原理图与源码齐全,CAN通信总线技术,电压范围广泛,BLDC无刷直流驱动控制板资料,可驱动300W电机,已量产(STM32 CAN总线)输入电压:15~36V 驱动功率:300W~500W ,20A电流检测,CAN通信总线 功能介绍 KEY1:运行 KEY2:停止 VR1:转速调节 带霍尔传感器 提供工程原理图和源码,AD9工程 内有提供电机型号 ,核心关键词:BLDC无刷直流驱动控制板;300W电机驱动;STM32 CAN总线;输入电压范围;驱动功率范围;20A电流检测;CAN通信总线;运行功能;停止功能;转速调节;霍尔传感器;工程原理图;源码;AD9工程;电机型号。,"300W电机驱动的BLDC控制板:STM32 CAN总线、多功能接口的电机控制技术资料"
西门子S7-1200PLC与KTP700触摸屏协同控制松下伺服电机:运动控制、位置显示与以太网通讯,西门子S7-1200PLC和KTP700触摸屏控制松下伺服电机运动控制程序4 程序简介:可以实现伺服电机的正转、反转控制,相对运动,显示电机的当前位置、速度和运行状态 硬件平台:西门子S7-1200PLC(CPU1215C)+西门子KTP700触摸屏+伺服电机+伺服电机控制器 软件平台:博图V13 SP1,(V14版本可以兼容打开) 通讯协议:以太网通讯 触摸屏ip地址:192.168.0.3 PLC的IP地址:192.168.0.1 ,S7-1200PLC; KTP700触摸屏; 松下伺服电机; 正反转控制; 相对运动控制; 位置显示; 速度显示; 运行状态显示; 以太网通讯; IP地址。,西门子PLC与KTP700触摸屏控制松下伺服电机运动程序——高效精准的运动控制方案
见证取样员题库与答案.doc
Qt网络请求客户端服务器源码:并发处理、多种连接与回复格式、个性化配色、灵活拓展与跨平台支持,Qt网络请求客户端服务器源码 ### (一)、功能特点 1. 支持多个客户端连接并发同时处理, 2. 可设置http请求是长连接还是短连接,默认长连接。 3. 支持多种回复数据格式,其中包括网页内容、json数据等。 4. 服务端示例中同时包含读取文件回复、读取数据库回复。 5. 支持8种配色方案(暗黑、灰黑、深绿、浅黄、深蓝、深黑、暗蓝、默认)。 6. 客户端可指定请求地址,服务端可指定和端口进行监听。 7. 所有请求和连接都有计数,所有在线请求的IP和端口都显示在表格中。 8. 可自由拓展增加权限校验等,作为一个http请求。 9. 代码框架整洁,注释完整,支持任意Qt版本、任意编译器、任意操作系统。 ,Qt网络请求; 客户端服务器; 并发处理; 长短连接设置; 多种回复数据格式; 服务端文件数据库回复; 配色方案; 指定请求地址和监听端口; 请求连接计数; 在线IP端口显示; 权限校验; 跨平台兼容性。,Qt网络通信:多客户端并发处理、灵活配置的HTTP请求服务器源码
基于FPGA的永磁同步电机FOC三闭环控制策略研究,基于FPGA的永磁同步电机控制,FOC控制,三闭环控制 ,基于FPGA的永磁同步电机控制; FOC控制; 三闭环控制。,"基于FPGA的永磁同步电机FOC控制:三闭环控制策略"
TMS320F28335核心控制的光伏离网并网逆变器设计:Boost升压与单相全桥逆变电路结构结合方案,量产光伏离网并网逆变器设计资料(TMS320F28335) 这个是单项的,三相价格一样 本装置DC-DC采用Boost升压,DCAC采用单相全桥逆变电路结构,以TI公司的浮点数字信号控制器TMS320F28335 DSP为控制电路核心,采用规则采样法和DSP片内ePWM模块功能实现PWM和SPWM波。 PV最大功率点跟踪(MPPT)采用了恒压跟踪法(CVT法)来实现,并用软件锁相环进行系统的同频、同相控制,控制灵活简单。 注:系统DCDC和DCAC的驱动PWM都由TMS320F28335提供,离网运行。 包含:原理图 PCB 文档 源码 ,核心关键词: 1. 量产光伏离网并网逆变器设计 2. TMS320F28335 3. Boost升压 4. 单相全桥逆变电路 5. 浮点数字信号控制器 6. 规则采样法 7. MPPT(最大功率点跟踪) 8. 恒压跟踪法(CVT法) 9. 软件锁相环 10. 原理图; PCB文档; 源码,基于TMS320F28335的光伏离网并网逆变器设计资料:
西门子S7-200编程软件实战:污水处理系统全自动控制及触摸屏操作实践(包含电气原理图和主程序与子程序),西门子S7-200编程软件,触摸屏,电气原理图。 污水处理系统。 主程序及子程序,过滤,反洗,正洗,PH,加药等全自动控制。 分手动和自动控制。 供新手学习和实践。 ,关键词:西门子S7-200编程软件; 触摸屏; 电气原理图; 污水处理系统; 主程序及子程序; 过滤; 反洗; 正洗; PH控制; 加药控制; 手动控制; 自动控制; 新手学习; 实践。,西门子S7-200编程软件在污水处理系统的应用实践