v7包中的ToolBar提供了多种方式方便用户与应用交互。这里再介绍两个多功能组件:

  • Action View 用于在应用栏提供丰富的功能。例如,一个搜索的_A_ction View可以让用户在应用栏上直接输入他们想要搜索的内容而不需要改动activity和fragment.

  • Action Provider 可以拥有自定义布局。当用户点击按钮或者菜单上的一个条目时,就触发了我们自定义的行为。比如点击一个Action Provider可以显示一个菜单。

Android 兼容支持包提供了很多Action View和_A_ction Provider的控件。比如,SearchView就是一个可以用于搜索的Action View,ShareActionProvider用于向其他应用分享信息的Action Provider。当然,也可以对_A_ction View或_A_ction Provider进行自定义。

添加Action View

Add Action Buttons课程里,我们学习到了通过创建<item>节点 实现ToolBar的菜单。接下来我们再介绍<item>中的两个属性:

  • actionViewClass 该控件继承自哪个控件类型

  • actionLayout 该控件所拥有的布局

对于属性showAsAction,无论设置成"ifRoom|collapseActionView"还是"never|collapseActionView"。标志collapseActionView都代表着默认的显示方式:如果他在应用栏上显示,他就是一个图标,如果他在更多的菜单里,他就是菜单中的一个条目。而当用户与这个Action View交互时,他就会放大充满应用栏。下面的代码就是应用栏中有个SearchView

<item android:id="@+id/action_search"
     android:title="@string/action_search"
     android:icon="@drawable/ic_search"
     app:showAsAction="ifRoom|collapseActionView"
     app:actionViewClass="android.support.v7.widget.SearchView" />

当用户没有与其交互时,Action View就会显示成一个由android:icon定义的图标(如果应用栏的空间不够大,他就会归到更多菜单中)。当用户点击时,它就会放大到充满应用栏,并且让用户可以与之交互。

想要对Action View进行自定义。可以覆写Activity的onCreateOptionsMenu()回调方法。其中通过调用静态的getActionView()方法就可以获取到Action View对象,就像下面这样:

@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) MenuItemCompat.getActionView(searchItem);

    // Configure the search info and add any event listeners...

    return super.onCreateOptionsMenu(menu);
}

响应Action View扩展

如果某个按钮或者菜单的<item>节点中有collapseActionView属性,应用就会只显示这个按钮或者菜单的图标,直到用户与之交互。用户点击时,Action View的扩展是在onOptionsItemSelected()方法中实现的。所以如果页面覆写了该方法,就必须调用super.onOptionsItemSelected()以实现其处理逻辑。

想要在动作收起或展开时加入自己的逻辑,可以自定义一个类来实现MenuItem.OnActionExpandListener,之后将其作为参数传给setOnActionExpandListener()。比如,想要在动作收起或展开时,更新Activity。就可以向下面这样:

@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 action item collapses
            return true;  // Return true to collapse action view
        }

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) {
            // Do something when expanded
            return true;  // Return true to expand 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);

    // Any other things you have to do when creating the options menu…

    return true;
}

添加Action Provider

想要添加一个Action Provider,只需要在<item>节点上添加actionProviderClass属性,然后设置一个action provider的全量类名就可以。举个例子,下面的代码定义了一个ShareActionProvider,它是兼容支持包里自带的,可以向其他应用分享数据。

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

在这里,ShareActionProvider自带图标,而不再需要我们去指定。当然,如果你是其他动作,仍然需要指定一个图标。想要了解更多关于Action Provider,可以参考这里ActionProvider

results matching ""

    No results matching ""