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>
好了,看看效果: