在 2.0及以上版本,需要引入android.support.v7包,然后再继承ActionBarActivity,并且把AndroidManifest文件里Activity主题改为Theme.AppCompat系列,如果想自定义ActionBar的样式还需要在xml里自定义属性名。
3.0以上版本,系统自带了默认的ActionBar功能,所以不需要再引入包,也不需要继承其他的Activity,使用变得异常简单。因为现在2.0版本的系统使用太少,在这里我主要记录一下针对API11及以上的版本ActionBar的用法。
一)在ActionBar上添加按钮
1)创建一个项目后,系统会自动创建带有action_settings的menu,我们想要添加按钮,需要在res/menu/main.xml里添加item
这里的orderInCategory属性代表优先级,优先级越高的越优先使用空间;showAsAction属性是指示显示的条件,常用的有这么几个值,ifRoom是如果有空间就显示出来,如果空间不足就放进左边的隐藏空间;never是永远不单独占用空间显示,一直在最左边的隐藏空间里放着;always是不管有没有空间,一直显示出来;icon是指定显示的图标;title属性值必须是在res/values/string.xml里声明过的值,可以通过快捷键crtl+1来声明。
2)在.java文件里,通过onCreateOptionsMenu(Menu menu)来加载ActionBar
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_settings:
openSettings();
return true;
case R.id.action_search:
openSearch();
return true;
default:
return super.onContextItemSelected(item);
}
}
private void openSearch(){
Intent intent=new Intent();
intent.setAction("android.intent.action.VIEW");
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
}
private void openSettings(){
Toast.makeText(MainActivity.this, "成功打开设置界面", Toast.LENGTH_SHORT).show();
}
1)打开res/values下的目录,新建xml文件,命名为themes,在里面创建我们自己的ActionBar主题,注意主题和样式都需要声明父主题,也就是继承自Theme.Holo系列主题
2)在AndroidManifest里可以为全局或者单个Activity指定Theme即可
android:theme="@style/CustomActionBarTheme" >
效果如下所示
三)叠加模式(overlay mode)的使用:隐藏ActionBar
一般情况下,标题栏是in top of layout,我们可以使用hide()和show()来隐藏和显示它,但是这样会导致activity重新计算尺寸和绘制布局,因此我们可以使用另一种方法,使用叠加模式,在这种模式下,标题栏是in front of layout,布局里的内容可以填充整个布局
使用叠加模式,需要自定义主题,并且继承自已经存在的主题,然后声明android:windowActionBarOverlay的值为true
1)在res/values/themes.xml文件里创建新的样式
android:theme="@style/CustomActionBarOverlayTheme"
四)Action Provider的使用,ActionBar有个功能是分享按钮,先在res/menu.main.xml文件里添加这个按钮
注意指定
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
MenuItem shareItem=menu.findItem(R.id.action_share);
ShareActionProvider mActionProvider=(ShareActionProvider) shareItem.getActionProvider();
mActionProvider.setShareIntent(setDefaultIntent());
return true;
}
private Intent setDefaultIntent(){
Intent intent=new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
return intent;
}
五)ActionBarSherlock的使用
在最早的时候,谷歌没有在V7包中添加这个ActionBar的功能,人们使用开源库ActionBarSherlock来实现这个功能,这是位于github上的开源库,使用它需要先下载好开源库,然后导入ADT里,让自己的项目依赖这个库包。
它的使用方法和ActionBar的方法基本一样,这里我们使用它实现一个下拉列表菜单项的功能
自己的Activity需要继承SherlockActivity,然后通过getSupportActionBar()来获取到ActionBar的实例,设置其模式为ActionBar.NAVIGATION_MODE_LIST,调用setListNavigationCallbacks()来传入适配器数据,并且给列表项设置点击事件。
效果如下图所示
public class MainActivity extends SherlockActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar action=getSupportActionBar();
action.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
ArrayAdapter arrayAdapter=new ArrayAdapter(this,android.R.layout.simple_expandable_list_item_1);
for(int i=0;i<5;i++)
arrayAdapter.add("刘家威"+i);
action.setListNavigationCallbacks(arrayAdapter, new OnNavigationListener() {
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId)
{
Toast.makeText(MainActivity.this,
"您选择了"+itemPosition,0).show();
return false;
}
});
}
}