AndroidX 库的 Toolbar
为用户提供了与应用互动的不同方式。添加和处理操作介绍了如何定义操作,该操作可以是按钮或菜单项。本文档介绍了如何添加两个多功能组件:
- 操作视图是一种可在应用栏中提供丰富功能的操作。例如,借助搜索操作视图,用户可以在应用栏中输入搜索文本,而无需更改 activity 或 fragment。
- 操作提供器是一种具有自己的自定义布局的操作。操作最初显示为按钮或菜单项;当用户点按该操作时,操作提供器会以您定义的任何方式控制该操作的行为。例如,操作提供器可以通过显示菜单来响应点按操作。
AndroidX 提供了一些专用的操作视图和操作提供器 widget。例如,SearchView
widget 实现一个用于输入搜索查询的操作视图。ShareActionProvider
widget 可实现一个操作提供器,用于与其他应用共享信息。您还可以定义自己的操作视图和操作提供器。
添加操作视图
如需添加操作视图,请按照添加和处理操作中所述,在工具栏的菜单资源中创建 <item>
元素。将以下属性之一添加到 <item>
元素中:
actionViewClass
:实现操作的 widget 的类actionLayout
:描述操作组件的布局资源
将 showAsAction
属性设置为 "ifRoom|collapseActionView"
或 "never|collapseActionView"
。collapseActionView
标志用于指示在用户未与 widget 互动时如何显示 widget。如果 widget 位于应用栏中,应用会将 widget 显示为图标。如果 widget 位于溢出菜单中,则应用会将 widget 显示为菜单项。当用户与操作视图互动时,该操作视图会展开即可填满应用栏。
例如,以下代码会将 SearchView
widget 添加到应用栏中:
<item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@drawable/ic_search" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="androidx.appcompat.widget.SearchView" />
如果用户未与此 widget 互动,应用会将此 widget 显示为 android:icon
指定的图标。如果应用栏中没有空间,应用会将该操作添加到溢出菜单中。
当用户点按图标或菜单项时,该 widget 会展开即可填满工具栏,让用户能够与其互动。
如果您需要配置操作,请在 activity 的 onCreateOptionsMenu()
回调中进行配置。您可以通过调用 getActionView()
方法来获取操作视图的对象引用。例如,以下代码可获取上一个代码示例中定义的 SearchView
widget 的对象引用:
Kotlin
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.main_activity_actions, menu) val searchItem = menu?.findItem(R.id.action_search) val searchView = searchItem?.actionView as SearchView // Configure the search info and add any event listeners. return super.onCreateOptionsMenu(menu) }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_activity_actions, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) searchItem.getActionView(); // Configure the search info and add any event listeners. return super.onCreateOptionsMenu(menu); }
对操作视图展开的响应
如果操作的 <item>
元素具有 collapseActionView
标志,则应用会将操作视图显示为图标,直到用户与操作视图互动。当用户点按该图标时,内置的 onOptionsItemSelected()
处理程序会展开操作视图。如果 activity 子类替换了 onOptionsItemSelected()
方法,替换方法必须调用 super.onOptionsItemSelected()
,以便父类可以展开操作视图。
如果您想在操作处于展开或收起状态时执行某些操作,可以定义一个实现 MenuItem.OnActionExpandListener
的类,并将该类的成员传递给 setOnActionExpandListener()
。
例如,您可能想要根据操作视图是展开还是收起来更新 activity。以下代码段展示了如何定义和传递监听器:
Kotlin
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.options, menu) // Define the listener. val expandListener = object : MenuItem.OnActionExpandListener { override fun onMenuItemActionCollapse(item: MenuItem): Boolean { // Do something when the action item collapses. return true // Return true to collapse the action view. } override fun onMenuItemActionExpand(item: MenuItem): Boolean { // Do something when it expands. return true // Return true to expand the action view. } } // Get the MenuItem for the action item. val actionMenuItem = menu?.findItem(R.id.myActionItem) // Assign the listener to that action item. actionMenuItem?.setOnActionExpandListener(expandListener) // For anything else you have to do when creating the options menu, // do the following: return true }
Java
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.options, menu); // Define the listener. OnActionExpandListener expandListener = new OnActionExpandListener() { @Override public boolean onMenuItemActionCollapse(MenuItem item) { // Do something when the action item collapses. return true; // Return true to collapse action view. } @Override public boolean onMenuItemActionExpand(MenuItem item) { // Do something when it expands. return true; // Return true to expand the action view. } }; // Get the MenuItem for the action item. MenuItem actionMenuItem = menu.findItem(R.id.myActionItem); // Assign the listener to that action item. MenuItemCompat.setOnActionExpandListener(actionMenuItem, expandListener); // For anything else you have to do when creating the options menu, // do the following: return true; }
添加操作提供器
如需声明操作提供器,请按照添加和处理操作中所述,在工具栏的菜单资源中创建 <item>
元素。添加 actionProviderClass
属性,并将其设为操作提供器类的完全限定类名。
例如,以下代码声明了 ShareActionProvider
,它是在 AndroidX 库中定义的一个 widget,可让您的应用与其他应用共享数据:
<item android:id="@+id/action_share" android:title="@string/share" app:showAsAction="ifRoom" app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>
在这种情况下,没有必要为该 widget 声明图标,因为 ShareActionProvider
会提供自己的图形。如果您使用的是自定义操作,请声明图标。
其他资源
- 有关向顶部应用栏添加分享操作的示例,请参阅
ShareActionProvider
。 - 如需详细了解如何创建自定义操作提供器,请参阅
ActionProvider
。