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

AndroidX库的Toolbar为用户提供了不同的方式与您的应用进行交互。添加和处理操作描述了如何定义一个操作,它可以是一个按钮或一个菜单项。本文档介绍了如何添加两个多功能组件

  • 一个操作视图是在应用栏中提供丰富功能的操作。例如,搜索操作视图允许用户在应用栏中键入其搜索文本,而无需更改活动或片段。
  • 一个操作提供程序是一个具有其自定义布局的操作。操作最初显示为按钮或菜单项;当用户点击操作时,操作提供程序会以您定义的任何方式控制操作的行为。例如,操作提供程序可能会通过显示菜单来响应点击。

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指定的图标。如果应用栏中没有空间,则应用会将操作添加到溢出菜单。

An image showing a search bar with a leading and trailing icons.
图 1.带有前导和尾随图标的搜索栏。

当用户点击图标或菜单项时,小部件会扩展以填充工具栏,允许用户与之交互。

An image showing a search view open once the search bar is focused.
图 2.搜索视图在搜索栏获得焦点后打开。

如果您需要配置操作,请在活动的onCreateOptionsMenu()回调中执行此操作。您可以通过调用getActionView()方法获取操作视图的对象引用。例如,以下代码获取先前代码示例中定义的SearchView小部件的对象引用

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()的内置处理程序会展开操作视图。如果您的活动子类覆盖了onOptionsItemSelected()方法,则您的覆盖方法必须调用super.onOptionsItemSelected(),以便超类可以展开操作视图。

如果要在操作展开或折叠时执行某些操作,则可以定义一个实现MenuItem.OnActionExpandListener的类,并将该类的成员传递给setOnActionExpandListener()。例如,您可能希望根据操作视图是否展开或折叠来更新活动。以下代码片段显示了如何定义和传递侦听器

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 库中定义的小部件,允许您的应用与其他应用共享数据

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

在这种情况下,无需为小部件声明图标,因为ShareActionProvider提供了自己的图形。如果您使用的是自定义操作,请声明一个图标。

其他资源

  • 请参阅ShareActionProvider,了解如何将共享操作添加到顶部应用栏的示例。
  • 请参阅ActionProvider,以获取有关创建自定义操作提供程序的更多信息。