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" 
   2.         android:windowSoftInputMode="stateVisible"> 
   3.     <intent-filter android:label="@string/resolve_myadd"> 
   4.         <action android:name="com.android.notepad.action.MYADD" /> 
   5.         <category android:name="android.intent.category.ALTERNATIVE" /> 
   6.         <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> 
   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" /> <category android:name="android.intent.category.ALTERNATIVE" /> <data android:mimeType="vnd.android.cursor.item/vnd.google.note" /> </intent-filter> </activity>

写好该activity的layout和实现后,选中noteslist中的一项后,点 menu可以看到菜单中多出了一项,点击可以切换到该activity。

这是以函数中Intent匹配的菜单项,当然也可以用Specifics来匹配。下面示例:

删除掉MyAdd这个activity中的 <category android:name="android.intent.category.ALTERNATIVE" />,这时该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来匹配的。
相关文章
|
6月前
|
JavaScript 前端开发
12EasyUI 菜单与按钮- 创建分割按钮(Split Button)
12EasyUI 菜单与按钮- 创建分割按钮(Split Button)
35 0
|
8月前
TienChin 创建菜单页面
上一节当中我们只是给后台添加了对应的菜单,实际上对应的页面还没有存在这节主要就是创建出来页面: • 促销活动: activity • 统计分析: analysis • 商机管理: business • 渠道管理: channel • 线索管理: clue • 合同管理: contract • 私教课程: course • 转派管理: transfer
37 0
|
6月前
|
JavaScript 前端开发
11EasyUI 菜单与按钮- 创建菜单按钮(Menu Button)
11EasyUI 菜单与按钮- 创建菜单按钮(Menu Button)
22 0
|
XML Java Android开发
菜单(Menu)
本章给大家带来的是Android中的Menu(菜单),而在Android中的菜单有如下几种: OptionMenu:选项菜单,android中最常见的菜单,通过Menu键来调用 SubMenu:子菜单,android中点击子菜单将弹出一个显示子菜单项的悬浮框,子菜单不支持嵌套,即不能包括其他子菜单 ContextMenu:上下文菜单,通过长按某个视图组件后出现的菜单,该组件需注册上下文菜单本节我们来依依学习这几种菜单的用法~ PS:官方文档:menus 1.OptionMenu(选项菜单) 1)如何使用OptionMenu? 答:非常简单,重写两个方法就好,其实这两个方法我们在创
69 0
el-menu导航报错Missing required prop: "index"、点击只有一级菜单时不合上其他已展开菜单
el-menu导航报错Missing required prop: "index"、点击只有一级菜单时不合上其他已展开菜单
186 0
|
Linux
解决办法:gtk_image_menu_item_set_image()菜单图标无法显示
解决办法:gtk_image_menu_item_set_image()菜单图标无法显示
49 0
|
Android开发
NavigationView中,动态增加item以及menu
NavigationView中,动态增加item以及menu
304 0
|
JSON 数据格式
基于el-menu,用递归实现动态n级菜单
element-plus 的 el-menu 菜单组件,功能非常强大,支持n级菜单、图标等等功能。如果菜单是静态的,直接手撸的话,那么按照官网实例即可,但是如果需要基于json动态绑定,而且还是n级菜单,那么要怎么办呢?
899 0
|
Android开发 容器
Android动态修改ToolBar的Menu菜单
Android动态修改ToolBar的Menu菜单 效果图 实现 实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了。
1731 0