基于Intent来动态添加Menu的Item

来源:互联网 发布:中国老龄人口数据 编辑:程序博客网 时间:2024/05/24 06:36

基于Intent对象来添加菜单项

有些时候,你想要菜单项使用一个Intent对象来启动一个Activity(不管这个Activity是你的应用程序中的还是其他应用程序中的)。

当你知道你要使用的Intent对象,并且也指定了启动这个Intent对象的菜单项时,你就能够在对应的on-item-selected回调方法(如onOptionsItemSelected()回调方法)调用期间用startActivity()方法执行这个Intent对象。

但是,如果你不确定用户设备上是否包含了处理这个Intent对象的应用程序,那么添加调用这个Intent对象的菜单项就有可能导致一个非功能性菜单的产生,因为可能没有接受这个Intent对象的Activity。要解决这个问题,Android能够让你在设备上查找处理你的Intent对象的Activity时,动态的把菜单项添加到菜单中。

以下是在能够接受Intent对象的有效的Activity基础上来添加菜单项的方法:

  1. 用CATEGORY_ALTERNATIVE或CATEGORY_SELECTED_ALTERNATIVE分类,再加上一些其他的要求,定义一个Intent对象。

  2. 调用Menu.addIntentOptions()方法,Android会搜索系统中能够接受这个Intent对象的任何应用程序,并把它们添加到你的菜单中。

如果没有安装能够满足Intent要求的应用程序,那么就不会添加菜单项。

注意:CATEGORY_SELECTED_ALTERNATIVE被用于处理屏幕上当前被选择的元素。因此,应该只在用onCreateContextMenu()方法创建菜单时使用这个分类。

如:

@Override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);

// Create an Intent that describes the requirements to fulfill, to be included// in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.Intent intent = new Intent(null, dataUri);intent.addCategory(Intent.CATEGORY_ALTERNATIVE);// Search and populate the menu with acceptable offering applications.menu.addIntentOptions(     R.id.intent_group,  // Menu group to which new items will be added     0,      // Unique item ID (none)     0,      // Order for the items (none)     this.getComponentName(),   // The current activity name     null,   // Specific items to place first (none)     intent, // Intent created above that describes our requirements     0,      // Additional flags to control items (none)     null);  // Array of MenuItems that correlate to specific items (none)return true;

}

对于找到的每个提供了跟定义的Intent对象匹配的Intent过滤器的Activity,都会添加一个菜单项,这个菜单项使用Intent过滤器的android:label的属性值做为菜单项的标题、应用程序的图标做为菜单项的图标。addIntentOptions()方法返回被添加的菜单的个数。

注意:当你调用addIntentOptions()方法时,它会覆盖在第一个参数中指定的菜单组的所有菜单项。

允许你的Activity被添加给其他菜单

你也能够包Activity的服务提供给其他的应用程序,以便你的应用能够包含在其他应用的菜单中。

要想在其他的应用程序菜单中包含你的应用程序,你需要向通常那样定义一个Intent过滤器,但要确认包括CATEGORY_ALTERNATIVE或CATEGORY_SELECTED_ALTERNATIVE分类,如:

<intent-filter label="@string/resize_image">    ...    <category android:name="android.intent.category.ALTERNATIVE" />    <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />    ...</intent-filter>
阅读全文
0 0
原创粉丝点击