传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229
6添加Action Provider
与action view类似,Action Provider(由ActionProvider类定义的)用一个定制的布局代替一个action item,它还需要对所有这些item行为的控制。当你在action bar中给一个菜单项声明一个action item时,它不仅要一个定制的布局来控制这个菜单项的外观,而且当它显示在溢出菜单中时,还要处理它的默认事件。无论是在action bar中还是在溢出菜单中,它都能够提供一个子菜单。例如,ActionProvider的扩展类ShareActionProvider,它通过在action bar中显示一个有效的共享目标列表来方便共享操作。与使用传统的调用ACTION_SEND类型Intent对象的action item不同,你能够声明一个ShareActionProvider对象来处理一个action item。这种action provider会保留一个带有处理ACTION_SEND类型Intent对象的应用程序的下拉列表,即使这个菜单项显示在溢出菜单中。所以当你使用像这样的Action Provider时,你不必处理有关这个菜单项的用户事件。
要给一个操作项声明一个操作提供器,就要在菜单资源中对应的<item>元素中定义android:actionProviderClass属性,提供器要使用完整的类名。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_share"
android:title="@string/share"
android:showAsAction="ifRoom"
android:actionProviderClass="android.widget.ShareActionProvider" />
...
</menu>
在这个例子中,用ShareActionProvider类作为action provider,在这里,action provider需要菜单项的控制,并处理它们在action bar中的外观和行为以及在溢出菜单中的行为。你必须依然给这个菜单项提供一个用于溢出菜单的文本标题。
尽管action provider提供了它在溢出菜单中显示时所能执行的默认操作,但是Activity(或Fragment)也能够通过处理来自onOptionsItemSelected()回调方法的点击事件来重写这个默认操作。如果你不在这个回调方法中处理点击事件,那么action provider会接收onPerformDefaultAction()回调来处理事件。但是,如果action provider提供了一个子菜单,那么