菜单是许多类型应用中常见的用户界面组件。为了提供熟悉且一致的用户体验,请使用 Menu
API 在您的活动中显示用户操作和其他选项。
本文档介绍了如何在所有 Android 版本上创建三种基本类型的菜单或操作呈现方式
- 选项菜单和应用栏
- 选项菜单是活动的主要菜单项集合。您可以在其中放置对应用产生全局影响的操作,例如“搜索”、“撰写电子邮件”和“设置”。
请参阅 创建选项菜单 部分。
- 上下文菜单和上下文操作模式
- 上下文菜单是 浮动菜单,当用户对某个元素执行触摸并按住操作时出现。它提供影响所选内容或上下文框架的操作。
上下文操作模式 显示影响所选内容的操作项,位于屏幕顶部的栏中,并允许用户选择多个项目。
请参阅 创建上下文菜单 部分。
- 弹出菜单
- 弹出菜单显示一个垂直项目列表,该列表固定在调用菜单的视图上。它非常适合提供与特定内容相关的操作溢出,或为命令的第二部分提供选项。弹出菜单中的操作不会直接影响相应的内容——这就是上下文操作的作用。相反,弹出菜单用于扩展与活动中内容区域相关的操作。
请参阅 创建弹出菜单 部分。
在 XML 中定义菜单
对于所有菜单类型,Android 提供了一种标准的 XML 格式来定义菜单项。而不是在活动的代码中构建菜单,请在 XML 菜单资源 中定义菜单及其所有项目。然后,您可以在您的活动或片段中扩展菜单资源——将其加载为 Menu
对象。
使用菜单资源是最佳实践,原因如下
- 在 XML 中更容易可视化菜单结构。
- 它将菜单内容与应用的行为代码分开。
- 它允许您通过利用 应用资源 框架为不同的平台版本、屏幕尺寸和其他配置创建替代菜单配置。
要定义菜单,请在项目的 res/menu/
目录中创建一个 XML 文件,并使用以下元素构建菜单
<menu>
- 定义一个
Menu
,它是菜单项的容器。<menu>
元素必须是文件的根节点,并且可以包含一个或多个<item>
和<group>
元素。 <item>
- 创建一个
MenuItem
,它表示菜单中的单个项目。此元素可以包含一个嵌套的<menu>
元素以创建子菜单。 <group>
- 一个可选的、不可见的
<item>
元素容器。它允许您对菜单项进行分类,以便它们共享属性,例如活动状态和可见性。有关更多信息,请参阅 创建菜单组 部分。
这是一个名为 game_menu.xml
的示例菜单
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/new_game" android:icon="@drawable/ic_new_game" android:title="@string/new_game" app:showAsAction="ifRoom"/> <item android:id="@+id/help" android:icon="@drawable/ic_help" android:title="@string/help" /> </menu>
<item>
元素支持您可以用来定义项目的显示和行为的几个属性。前面菜单中的项目包含以下属性
android:id
- 对项目唯一的资源 ID,允许应用在用户选择项目时识别该项目。
android:icon
- 对用作项目图标的可绘制对象的引用。
android:title
- 对用作项目标题的字符串的引用。
android:showAsAction
- 此项目何时以及如何在应用栏中显示为操作项目的规范。
这些是您使用最重要的属性,但还有更多可用属性。有关所有支持属性的信息,请参阅 菜单资源 文档。
您可以通过将 <menu>
元素添加为 <item>
的子元素,将子菜单添加到任何菜单中的项目中。当您的应用有很多可以组织成主题的功能时,子菜单非常有用,就像 PC 应用菜单栏中的项目一样——例如文件、编辑和查看。请参阅以下示例
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/file" android:title="@string/file" > <!-- "file" submenu --> <menu> <item android:id="@+id/create_new" android:title="@string/create_new" /> <item android:id="@+id/open" android:title="@string/open" /> </menu> </item> </menu>
要在您的活动中使用菜单,请_扩展_菜单资源,使用 MenuInflater.inflate()
将 XML 资源转换为可编程对象。以下部分介绍了如何为每种菜单类型扩展菜单。
创建选项菜单
选项菜单(如示例 1 中所示)是您包含与当前活动上下文相关的操作和其他选项的位置,例如“搜索”、“撰写电子邮件”和“设置”。
您可以从 Activity
子类或 Fragment
子类声明选项菜单的项目。如果您的活动和片段都为选项菜单声明了项目,则这些项目将在 UI 中合并。活动项目首先出现,然后是每个片段的项目,按照将片段添加到活动的顺序排列。如有必要,您可以使用每个 <item>
中的 android:orderInCategory
属性重新排序菜单项。
要指定活动的选项菜单,请重写 onCreateOptionsMenu()
。片段提供自己的 onCreateOptionsMenu()
回调。在此方法中,您可以将 在 XML 中定义的 菜单资源扩展到回调中提供的 Menu
中。这在以下示例中显示
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { val inflater: MenuInflater = menuInflater inflater.inflate(R.menu.game_menu, menu) return true }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.game_menu, menu); return true; }
您还可以使用 add()
添加菜单项,并使用 findItem()
检索项目以使用 MenuItem
API 修改其属性。
处理点击事件
当用户从选项菜单中选择一个项目(包括应用栏中的操作项目)时,系统会调用活动的 onOptionsItemSelected()
方法。此方法传递所选的 MenuItem
。您可以通过调用 getItemId()
识别该项目,该方法返回菜单项目的唯一 ID,该 ID 由菜单资源中的 android:id
属性定义或由给定给 add()
方法的整数定义。您可以将此 ID 与已知的菜单项进行匹配以执行适当的操作。
Kotlin
override fun onOptionsItemSelected(item: MenuItem): Boolean { // Handle item selection. return when (item.itemId) { R.id.new_game -> { newGame() true } R.id.help -> { showHelp() true } else -> super.onOptionsItemSelected(item) } }
Java
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection. switch (item.getItemId()) { case R.id.new_game: newGame(); return true; case R.id.help: showHelp(); return true; default: return super.onOptionsItemSelected(item); } }
当您成功处理菜单项时,返回 true
。如果您不处理菜单项,请调用 onOptionsItemSelected()
的超类实现。默认实现返回 false。
如果您的活动包含片段,则系统首先为活动调用 onOptionsItemSelected()
,然后按照添加片段的顺序为每个片段调用,直到一个返回 true
或所有片段都被调用。
在运行时更改菜单项
系统在调用 onCreateOptionsMenu()
后,会保留您填充的 Menu
实例,并且除非菜单失效,否则不会再次调用 onCreateOptionsMenu()
。但是,仅在创建初始菜单状态时使用 onCreateOptionsMenu()
,而不要在 Activity 生命周期中进行更改。
如果您想根据 Activity 生命周期中发生的事件修改选项菜单,可以在 onPrepareOptionsMenu()
方法中执行此操作。此方法会传递当前存在的 Menu
对象,以便您可以对其进行修改,例如添加、删除或禁用项。片段也提供了一个 onPrepareOptionsMenu()
回调。
当菜单项显示在应用栏中时,选项菜单被认为始终处于打开状态。当发生事件并且您想执行菜单更新时,请调用 invalidateOptionsMenu()
以请求系统调用 onPrepareOptionsMenu()
。
创建上下文菜单
上下文菜单提供影响 UI 中特定项目或上下文框架的操作。您可以为任何视图提供上下文菜单,但它们最常用于 RecylerView
或其他视图集合中的项目,用户可以在其中对每个项目执行直接操作。
有两种方法可以提供上下文操作
- 在 浮动上下文菜单 中。当用户对声明支持上下文菜单的视图执行触摸并按住操作时,菜单会显示为浮动菜单项列表,类似于对话框。用户可以一次对一个项目执行上下文操作。
- 在 上下文操作模式 中。此模式是
ActionMode
的系统实现,它在屏幕顶部显示一个上下文操作栏或 CAB,其中包含影响所选项目的操作项。在此模式处于活动状态时,如果您的应用支持,用户可以一次对多个项目执行操作。
注意:上下文菜单 不支持项目快捷方式和项目图标。
创建浮动上下文菜单
要提供浮动上下文菜单,请执行以下操作
- 通过调用
registerForContextMenu()
并传递View
来注册与上下文菜单关联的View
。如果您的 Activity 使用
RecyclerView
并且希望每个项目提供相同的上下文菜单,请通过将RecyclerView
传递给registerForContextMenu()
来为所有项目注册上下文菜单。 - 在您的
Activity
或Fragment
中实现onCreateContextMenu()
方法。当注册的视图收到触摸并按住事件时,系统会调用您的
onCreateContextMenu()
方法。在这里,您定义菜单项,通常通过膨胀菜单资源来定义,如下例所示Kotlin
override fun onCreateContextMenu(menu: ContextMenu, v: View, menuInfo: ContextMenu.ContextMenuInfo) { super.onCreateContextMenu(menu, v, menuInfo) val inflater: MenuInflater = menuInflater inflater.inflate(R.menu.context_menu, menu) }
Java
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); }
MenuInflater
允许您从菜单资源中膨胀上下文菜单。回调方法参数包括用户选择的View
和一个ContextMenu.ContextMenuInfo
对象,该对象提供有关所选项目的其他信息。如果您的 Activity 有多个视图,每个视图都提供不同的上下文菜单,则可以使用这些参数来确定要膨胀哪个上下文菜单。 实现
onContextItemSelected()
,如下例所示。当用户选择菜单项时,系统会调用此方法,以便您可以执行相应的操作。Kotlin
override fun onContextItemSelected(item: MenuItem): Boolean { val info = item.menuInfo as AdapterView.AdapterContextMenuInfo return when (item.itemId) { R.id.edit -> { editNote(info.id) true } R.id.delete -> { deleteNote(info.id) true } else -> super.onContextItemSelected(item) } }
Java
@Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.edit: editNote(info.id); return true; case R.id.delete: deleteNote(info.id); return true; default: return super.onContextItemSelected(item); } }
getItemId()
方法查询所选菜单项的 ID,您使用android:id
属性在 XML 中为每个菜单项分配该 ID,如 在 XML 中定义菜单 中所示。当您成功处理菜单项时,返回
true
。如果您不处理菜单项,请将菜单项传递给超类实现。如果您的 Activity 包含片段,则 Activity 会首先收到此回调。通过在未处理时调用超类,系统会将事件依次传递到每个片段中的相应回调方法,直到返回true
或false
为止。Activity
和android.app.Fragment
的默认实现返回false
,因此在未处理时始终调用超类。
使用上下文操作模式
上下文操作模式是 ActionMode
的系统实现,它将用户交互集中在执行上下文操作上。当用户通过选择项目启用此模式时,上下文操作栏会出现在屏幕顶部,以显示用户可以对所选项目执行的操作。在此模式启用时,如果您的应用支持,用户可以选择多个项目,还可以取消选择项目并在 Activity 中继续导航。当用户取消选择所有项目、点击“后退”按钮或点击栏左侧的完成操作时,操作模式将被禁用,上下文操作栏将消失。
对于提供上下文操作的视图,您通常会在发生以下两个事件之一或两者时调用上下文操作模式
- 用户对视图执行触摸并按住操作。
- 用户在视图中选择复选框或类似的 UI 组件。
您的应用如何调用上下文操作模式以及为每个操作定义行为取决于您的设计。有两种设计
- 针对单个任意视图上的上下文操作。
- 针对
RecyclerView
中项目组的批处理上下文操作,允许用户选择多个项目并对所有项目执行操作。
以下部分介绍了每种方案所需的设置。
为单个视图启用上下文操作模式
如果您只想在用户选择特定视图时调用上下文操作模式,请执行以下操作
- 实现
ActionMode.Callback
接口,如下例所示。在其回调方法中,您可以指定上下文操作栏的操作、响应操作项上的点击事件以及处理操作模式的其他生命周期事件。Kotlin
private val actionModeCallback = object : ActionMode.Callback { // Called when the action mode is created. startActionMode() is called. override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { // Inflate a menu resource providing context menu items. val inflater: MenuInflater = mode.menuInflater inflater.inflate(R.menu.context_menu, menu) return true } // Called each time the action mode is shown. Always called after // onCreateActionMode, and might be called multiple times if the mode // is invalidated. override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean { return false // Return false if nothing is done } // Called when the user selects a contextual menu item. override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { return when (item.itemId) { R.id.menu_share -> { shareCurrentItem() mode.finish() // Action picked, so close the CAB. true } else -> false } } // Called when the user exits the action mode. override fun onDestroyActionMode(mode: ActionMode) { actionMode = null } }
Java
private ActionMode.Callback actionModeCallback = new ActionMode.Callback() { // Called when the action mode is created. startActionMode() is called. @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // Inflate a menu resource providing context menu items. MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); return true; } // Called each time the action mode is shown. Always called after // onCreateActionMode, and might be called multiple times if the mode // is invalidated. @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; // Return false if nothing is done. } // Called when the user selects a contextual menu item. @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.menu_share: shareCurrentItem(); mode.finish(); // Action picked, so close the CAB. return true; default: return false; } } // Called when the user exits the action mode. @Override public void onDestroyActionMode(ActionMode mode) { actionMode = null; } };
这些事件回调与 选项菜单 的回调几乎完全相同,只是每个回调都还会传递与事件关联的
ActionMode
对象。您可以使用ActionMode
API 对 CAB 进行各种更改,例如使用setTitle()
和setSubtitle()
修改标题和副标题,这对于指示选择了多少个项目很有用。前面的示例在操作模式被销毁时将
actionMode
变量设置为null
。在下一步中,请查看它是如何初始化的以及在您的 Activity 或片段中保存成员变量如何有用。 - 当您想显示栏时调用
startActionMode()
,例如当用户对视图执行触摸并按住操作时。Kotlin
someView.setOnLongClickListener { view -> // Called when the user performs a touch & hold on someView. when (actionMode) { null -> { // Start the CAB using the ActionMode.Callback defined earlier. actionMode = activity?.startActionMode(actionModeCallback) view.isSelected = true true } else -> false } }
Java
someView.setOnLongClickListener(new View.OnLongClickListener() { // Called when the user performs a touch & hold on someView. public boolean onLongClick(View view) { if (actionMode != null) { return false; } // Start the CAB using the ActionMode.Callback defined earlier. actionMode = getActivity().startActionMode(actionModeCallback); view.setSelected(true); return true; } });
当您调用
startActionMode()
时,系统会返回创建的ActionMode
。通过将其保存在成员变量中,您可以根据其他事件对上下文操作栏进行更改。在前面的示例中,ActionMode
用于确保如果ActionMode
实例已经处于活动状态,则不会重新创建它,方法是在启动操作模式之前检查成员是否为 null。
创建弹出菜单
PopupMenu
是一个锚定到 View
的模态菜单。如果空间足够,它会出现在锚定视图下方,否则会出现在视图上方。它对以下情况很有用
- 为与特定内容相关的操作提供溢出样式菜单,例如图 4 中所示的 Gmail 的电子邮件标题。
- 提供命令句的第二部分,例如标记为添加的按钮,该按钮会生成一个包含不同添加选项的弹出菜单。
- 提供类似于
Spinner
的菜单,该菜单不保留持久选择。
如果您 在 XML 中定义菜单,则以下是如何显示弹出菜单的方法
- 使用其构造函数实例化一个
PopupMenu
,该构造函数需要当前应用Context
和菜单锚定的View
。 - 使用
MenuInflater
将您的菜单资源膨胀到PopupMenu.getMenu()
返回的Menu
对象中。 - 调用
PopupMenu.show()
。
例如,以下是一个显示弹出菜单的按钮
<ImageButton android:id="@+id/dropdown_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:contentDescription="@string/descr_overflow_button" android:src="@drawable/arrow_drop_down" />
然后,Activity 可以像这样显示弹出菜单
Kotlin
findViewById<ImageButton>(R.id.dropdown_menu).setOnClickListener { val popup = PopupMenu(this, it) val inflater: MenuInflater = popup.menuInflater inflater.inflate(R.menu.actions, popup.menu) popup.show() }
Java
findViewById(R.id.dropdown_menu).setOnClickListener(v -> { PopupMenu popup = new PopupMenu(this, v); popup.getMenuInflater().inflate(R.menu.actions, popup.getMenu()); popup.show(); });
当用户选择项目或点击菜单区域外部时,菜单会消失。您可以使用 PopupMenu.OnDismissListener
侦听消失事件。
处理点击事件
要在用户选择菜单项时执行操作,请实现 PopupMenu.OnMenuItemClickListener
接口,并通过调用 setOnMenuItemclickListener()
将其注册到您的 PopupMenu
。当用户选择项目时,系统会调用您接口中的 onMenuItemClick()
回调。
这在以下示例中显示
Kotlin
fun showMenu(v: View) { PopupMenu(this, v).apply { // MainActivity implements OnMenuItemClickListener. setOnMenuItemClickListener(this@MainActivity) inflate(R.menu.actions) show() } } override fun onMenuItemClick(item: MenuItem): Boolean { return when (item.itemId) { R.id.archive -> { archive(item) true } R.id.delete -> { delete(item) true } else -> false } }
Java
public void showMenu(View v) { PopupMenu popup = new PopupMenu(this, v); // This activity implements OnMenuItemClickListener. popup.setOnMenuItemClickListener(this); popup.inflate(R.menu.actions); popup.show(); } @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.archive: archive(item); return true; case R.id.delete: delete(item); return true; default: return false; } }
创建菜单组
菜单组是共享某些特征的菜单项的集合。使用组,您可以执行以下操作
- 使用
setGroupVisible()
显示或隐藏所有项目。 - 使用
setGroupEnabled()
启用或禁用所有项目。 - 使用
setGroupCheckable()
指定所有项目是否可选。
您可以通过在菜单资源中将 <item>
元素嵌套在 <group>
元素内,或者使用 add()
方法指定组 ID 来创建一个组。
这是一个包含组的菜单资源示例
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/menu_save" android:icon="@drawable/menu_save" android:title="@string/menu_save" /> <!-- menu group --> <group android:id="@+id/group_delete"> <item android:id="@+id/menu_archive" android:title="@string/menu_archive" /> <item android:id="@+id/menu_delete" android:title="@string/menu_delete" /> </group> </menu>
位于组中的项目显示在第一个项目的同一级别 - 菜单中的所有三个项目都是同级。但是,您可以通过引用组 ID 并使用前面提到的方法来修改组中两个项目的特性。系统也永远不会分离分组的项目。例如,如果您为每个项目声明 android:showAsAction="ifRoom"
,则它们都显示在操作栏中或都显示在操作溢出菜单中。
使用可选菜单项
菜单可以用作打开或关闭选项的界面,使用复选框表示独立选项,或使用单选按钮表示互斥选项组。图 5 显示了一个子菜单,其中包含使用单选按钮可选的项目。
您可以使用 <item>
元素中的 android:checkable
属性为各个菜单项定义可选行为,或使用 <group>
元素中的 android:checkableBehavior
属性为整个组定义可选行为。例如,此菜单组中的所有项目都使用单选按钮可选
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/red" android:title="@string/red" /> <item android:id="@+id/blue" android:title="@string/blue" /> </group> </menu>
android:checkableBehavior
属性接受以下值之一
single
- 组中只能选中一个项目,从而显示单选按钮。
all
- 所有项目都可选中,从而显示复选框。
none
- 没有项目可选。
您可以使用 <item>
元素中的 android:checked
属性为项目应用默认选中状态,并使用 setChecked()
方法在代码中更改它。
当选中可选项目时,系统会调用相应的项目选择回调方法,例如 onOptionsItemSelected()
。您需要在此处设置复选框的状态,因为复选框或单选按钮不会自动更改其状态。您可以使用 isChecked()
查询项目的当前状态(即用户选择它之前的状态),然后使用 setChecked()
设置选中状态。以下示例演示了这一点
Kotlin
override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.vibrate, R.id.dont_vibrate -> { item.isChecked = !item.isChecked true } else -> super.onOptionsItemSelected(item) } }
Java
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.vibrate: case R.id.dont_vibrate: if (item.isChecked()) item.setChecked(false); else item.setChecked(true); return true; default: return super.onOptionsItemSelected(item); } }
如果不以这种方式设置选中状态,则当用户选择复选框或单选按钮时,其可见状态不会发生变化。当您设置状态时,活动会保留项目的选中状态,以便用户稍后打开菜单时,您设置的选中状态可见。
基于 Intent 添加菜单项
有时您希望菜单项使用 Intent
启动活动,无论该活动是在您的应用中还是在其他应用中。当您知道要使用的 Intent 并有一个启动该 Intent 的特定菜单项时,您可以在适当的项目选择回调方法(例如 onOptionsItemSelected()
回调)中使用 startActivity()
执行该 Intent。
但是,如果您不确定用户的设备上是否安装了可以处理该 Intent 的应用,则添加一个调用该 Intent 的菜单项可能会导致菜单项无法使用,因为该 Intent 可能无法解析为活动。为了解决这个问题,Android 允许您在 Android 找到设备上可以处理您的 Intent 的活动时动态地将菜单项添加到您的菜单中。
要基于可以接受 Intent 的可用活动添加菜单项,请执行以下操作
- 使用类别
CATEGORY_ALTERNATIVE
或CATEGORY_SELECTED_ALTERNATIVE
(或两者)以及任何其他要求定义 Intent。 - 调用
Menu.addIntentOptions()
。然后,Android 会搜索可以执行该 Intent 的任何应用,并将它们添加到您的菜单中。
如果没有安装满足 Intent 的应用,则不会添加任何菜单项。
这在以下示例中显示
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { super.onCreateOptionsMenu(menu) // Create an Intent that describes the requirements to fulfill, to be // included in the menu. The offering app must include a category value // of Intent.CATEGORY_ALTERNATIVE. val intent = Intent(null, dataUri).apply { addCategory(Intent.CATEGORY_ALTERNATIVE) } // Search and populate the menu with acceptable offering apps. menu.addIntentOptions( R.id.intent_group, // Menu group to which new items are added. 0, // Unique item ID (none). 0, // Order for the items (none). this.componentName, // The current activity name. null, // Specific items to place first (none). intent, // Intent created above that describes the requirements. 0, // Additional flags to control items (none). null) // Array of MenuItems that correlate to specific items (none). return true }
Java
@Override public boolean onCreateOptionsMenu(Menu menu){ super.onCreateOptionsMenu(menu); // Create an Intent that describes the requirements to fulfill, to be // included in the 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 apps. menu.addIntentOptions( R.id.intent_group, // Menu group to which new items are 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 the requirements. 0, // Additional flags to control items (none). null); // Array of MenuItems that correlate to specific items (none). return true; }
对于找到的每个提供与定义的 Intent 匹配的 Intent 过滤器的活动,都会添加一个菜单项,使用 Intent 过滤器中的 android:label
值作为菜单项标题,并使用应用图标作为菜单项图标。 addIntentOptions()
方法返回添加的菜单项数量。
允许其他菜单添加您的活动
您可以向其他应用提供您的活动的服务,以便您的应用可以包含在其他应用的菜单中 - 反转前面描述的角色。
要包含在其他应用的菜单中,请照常定义 Intent 过滤器,但将 CATEGORY_ALTERNATIVE
或 CATEGORY_SELECTED_ALTERNATIVE
值(或两者)包含在 Intent 过滤器的类别中。以下示例演示了这一点
<intent-filter label="@string/resize_image"> ... <category android:name="android.intent.category.ALTERNATIVE" /> <category android:name="android.intent.category.SELECTED_ALTERNATIVE" /> ... </intent-filter>
有关编写 Intent 过滤器的更多信息,请参阅 Intent 和 Intent 过滤器。