使用操作视图和操作提供程序

试试 Compose 方式
Jetpack Compose 是推荐用于 Android 的界面工具包。了解如何在 Compose 中添加组件。

AndroidX 库的 Toolbar 提供了多种不同的方式让用户与应用互动。添加和处理操作介绍了如何定义“操作”,操作既可以是按钮,也可以是菜单项。本文档介绍了如何添加两种多功能组件:

  • 操作视图是一种能够在应用栏中提供丰富功能的操作。例如,借助搜索操作视图,用户可以在应用栏中输入搜索文字,而无需更改 activity 或 fragment。
  • 操作提供器是一种具有自定义布局的操作。此操作一开始会显示为按钮或菜单项;当用户点按此操作时,操作提供程序便会以您定义的任何方式控制此操作的行为。例如,操作提供程序可以通过显示菜单来响应点按。

AndroidX 提供了数个专用的操作视图和操作提供器微件。例如,SearchView 微件可以实现用于输入搜索查询的操作视图。ShareActionProvider 微件可以实现用于与其他应用共享信息的操作提供器。您还可以定义自己的操作视图和操作提供程序。

添加操作视图

如需添加操作视图,请按照添加和处理操作中所述,在工具栏的菜单资源中创建 <item> 元素。将以下属性之一添加到 <item> 元素:

  • actionViewClass:实现操作的微件的类
  • actionLayout:描述操作组件的布局资源

showAsAction 属性设置为 "ifRoom|collapseActionView""never|collapseActionView"collapseActionView 标记用于指明在用户未与微件互动时应如何显示微件。如果微件位于应用栏中,则应用会将微件显示为图标。如果微件位于溢出菜单中,则应用会将微件显示为菜单项。当用户与操作视图互动时,它应该展开即可填满应用栏。

例如,以下代码会将 SearchView 微件添加到应用栏中:

<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" />

如果用户未与此微件互动,应用会将此微件显示为 android:icon 指定的图标。如果应用栏空间不足,则应用会将该操作添加到溢出菜单中。

一张图片,显示了一个带有前置和后置图标的搜索栏。
图 1. 带有前置和后置图标的搜索栏。

当用户点按图标或菜单项时,此微件会展开即可填满工具栏,让用户能够与其互动。

一张图片,显示了在聚焦搜索栏后打开的搜索视图。
图 2. 将焦点移至搜索栏后,系统会打开搜索视图。

如果您需要配置操作,请在 activity 的 onCreateOptionsMenu() 回调中进行配置。您可以通过调用 getActionView() 方法来获取操作视图的对象引用。例如,以下代码可以获取在上一个代码示例中定义的 SearchView 微件的对象引用:

KotlinJava
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)
}
@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。以下代码段展示了如何定义和传递监听器:

KotlinJava
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
}
@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 库中定义的一个微件,可以让您的应用与其他应用共享数据:

<item android:id="@+id/action_share"
    android:title="@string/share"
    app:showAsAction="ifRoom"
    app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"/>

在本例中,不必为此微件声明图标,因为 ShareActionProvider 提供了自己的图形。如果您使用的是自定义操作,请声明图标。

其他资源

  • 如需查看向顶部应用栏添加分享操作的示例,请参阅 ShareActionProvider
  • 如需详细了解如何创建自定义操作提供器,请参阅 ActionProvider