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
。