Android自定义ActionProvider.
到底ActionProvider长什么样子的呢?就是这样子的:
ActionProvider属于Actionbar的一部分,所以需要支持API 10及以下的就需要使用到Support Library,然而,每次使用Support包的时候,总是想杀人,总是没有直接支持的来得好.我研究了一个晚上+一个早上,才知道怎么用,我真是太笨了.下面以Support Library为准.
SDK中有一个及成绩ActionProvider的ShareActionProvider,这可以调用系统的分享组件.具体的使用在ApiDemos中有,这里也有 http://developer.android.com/guide/topics/ui/actionbar.html#ActionProvider,分享的就不再啰嗦.
下面讲一下自定义:
思路:在Actionbar显示一个按钮,点击按钮 之后跳出子菜单(Submenu).
首先创建一个类,继承与ActionProvider,重写 onCreateActionView(), onPrepareSubMenu()及 hasSubMenu()这三个方法,注意的是,onCreateActionView返回的是null,如果不返回null,是无法弹出子菜单的.onPrepareSubMenu()就是创建子菜单,根据自己的需要创建.hasSubMenu()必须返回true,也必须重写,因为默认是返回false的.自定义好ActionProvider之后,接下来就添加到菜单项中,我新建了一个main.xml菜单文件,
因为使用的Support Library,创建菜单的时候一定要写上:
xmlns:app="http://schemas.android.com/apk/res-auto"
而属性的定义:app:showAsAction="always" 及 app:actionProviderClass="org.robam.menutest.app.MainActivity$MyActionbarProvider",这里的前缀app和上面xmlns对应.应用内部类使用的是$符号,而不是"."号,所自定义的MyActionbarProvider也要是static的.
public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 初始化菜单. * * @param menu * @return */ @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } /** * xml引用内部类,这个类需要时静态的. */ public static class MyActionbarProvider extends ActionProvider { Context mContext; /** * Creates a new instance. * * @param context Context for accessing resources. */ public MyActionbarProvider(Context context) { super(context); mContext = context; } /** * @return 需要返回null, 才能弹出子菜单. */ @Override public View onCreateActionView() { return null; } /** * 创建子菜单 * * @param subMenu */ @Override public void onPrepareSubMenu(SubMenu subMenu) { subMenu.clear(); subMenu.add(0, 0, 0, R.string.menu1).setIcon(R.drawable.ic_launcher).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(mContext, "submenu 1 was clicked", Toast.LENGTH_SHORT).show(); return true; } }); subMenu.add(0, 1, 1, R.string.menu2).setIcon(R.drawable.ic_launcher).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { Toast.makeText(mContext, "submenu 2 was clicked", Toast.LENGTH_SHORT).show(); return true; } }); } /** * @return 返回true代表有子菜单 */ @Override public boolean hasSubMenu() { return true; } } }
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="org.robam.menutest.app.MainActivity"> <item android:id="@+id/menu_item_share_action_provider_action_bar" app:showAsAction="always" android:title="hehe" android:icon="@drawable/ic_launcher" app:actionProviderClass="org.robam.menutest.app.MainActivity$MyActionbarProvider" /> </menu>
好了,看看效果: