天天看点

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

   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 函数中的代码改成如下:

   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来匹配的。