ActionBar菜单的特殊用法
ActionProvider:
可以为Action bar的菜单按钮添加子菜单。
新建了一个MyActionProvider继承自ActionProvider,重写hasSubMenu()方法并返回true,然后在onPrepareSubMenu通过调用SubMenu的add()方法添加子菜单。
public class MyActionProvider extends ActionProvider {
public MyActionProvider(Context context) {
super(context);
}
@Override
public View onCreateActionView() {
return null;
}
@Override
public void onPrepareSubMenu(SubMenu subMenu) {
subMenu.clear();
subMenu.add("sub item 1").setIcon(R.drawable.ic_launcher)
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return true;
}
});
subMenu.add("sub item 2").setIcon(R.drawable.ic_launcher)
.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
return false;
}
});
}
@Override
public boolean hasSubMenu() {
return true;
}
}
通过设置android:actionProviderClass将MyActionProvider加入菜单。为了兼容android 2.x,添加xmlns:yourappname="http://schemas.android.com/apk/res-auto",将android:改成yourapp:。
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:helloworld="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/MyActionProvider" android:icon="@drawable/MyActionProvider" android:orderInCategory="1" android:title="MyActionProvider" helloworld:actionProviderClass="com.example.helloworld.MyActionProvider" helloworld:showAsAction="ifRoom"/> </menu>
添加子菜单的另一种方法:在菜单资源文件<item></item>中插入<menu></menu>。
ActionView:
在ActionBar直接显示一个具体的视图。
在menu资源中通过actionViewClass属性来指定一个控件,通常使用SearchView,也可以是自定义控件。为兼容android 2.x,使用SearchView时导入android.support.v7.widget.SearchView,而不是android.widget.SearchView。
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:helloworld="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/CustomView" android:icon="@drawable/CustomView" android:orderInCategory="1" android:title="CustomView" helloworld:actionViewClass="com.example.helloworld.CustomView" helloworld:showAsAction="ifRoom|collapseActionView"/> </menu>
在Activity的onCreateOptionsMenu(Menu menu)函数获取ActionView。
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.optionsmenu, menu);
MenuItem menuItem = menu.findItem(R.id.CustomView);
CustomView customView = (CustomView) menuItem.getActionView();
//设置CustomView
......
return true;
}