您的位置:首页 > 运维架构

menu.addIntentOptions 添加动态菜单----转

2011-05-17 15:22 281 查看
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函数之后调用,这个函数的主要部分是如下代码:

01.
Uri uri = ContentUris.withAppendedId(getIntent().getData(), getSelectedItemId());   


02.
  
 
03.
  
 
04.
Intent[] specifics = new Intent[1];   

05.
specifics[0] = new Intent(Intent.ACTION_EDIT, uri);   

06.
MenuItem[] items = new MenuItem[1];   

07.
  
 
08.
  
 
09.
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);  


其中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

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的layout和实现后,选中noteslist中的一项后,点menu可以看到菜单中多出了一项,点击可以切换到该activity。
这是以函数中Intent匹配的菜单项,当然也可以用Specifics来匹配。下面示例:
删除掉MyAdd这个activity中的 <category android:name="android.intent.category.ALTERNATIVE" />,这时该activity已经与Intent不匹配了,
再将onPrepareOptionsMenu函数中的代码改成如下:

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];  


选中一项点菜会发现,动态菜单又回来了,不过这次是用Specific来匹配的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息