Android中ActionBar的用法详解

在 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;
	}

3)给按钮添加点击事件,通过onOptionsItemSelected(MenuItem item)来实现

	@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();
	}
Android中ActionBar的用法详解_第1张图片
二)默认的actionBar的风格虽然有很多,但是不一定能满足我们的特定需求,因此我们可以自定义ActionBar的风格, 为改变 action bar的背景,可以通过为 activity 创建一个自定义主题,并重写  actionBarStyle  属性来实现。 actionBarStyle  属性指向另一个样式;在该样式里,通过指定一个 drawable 资源来重写  background  属性。

1)打开res/values下的目录,新建xml文件,命名为themes,在里面创建我们自己的ActionBar主题,注意主题和样式都需要声明父主题,也就是继承自Theme.Holo系列主题



    
    
    
    


Note :为自定义主题和样式声明一个合适的父主题,这点很重要。如果没有父样式,action bar将会失去很多默认的样式属性,除非我们自己显式的对他们进行声明。

2)在AndroidManifest里可以为全局或者单个Activity指定Theme即可

 android:theme="@style/CustomActionBarTheme" >

效果如下所示

Android中ActionBar的用法详解_第2张图片


三)叠加模式(overlay mode)的使用:隐藏ActionBar

一般情况下,标题栏是in top of layout,我们可以使用hide()和show()来隐藏和显示它,但是这样会导致activity重新计算尺寸和绘制布局,因此我们可以使用另一种方法,使用叠加模式,在这种模式下,标题栏是in front of layout,布局里的内容可以填充整个布局

使用叠加模式,需要自定义主题,并且继承自已经存在的主题,然后声明android:windowActionBarOverlay的值为true

1)在res/values/themes.xml文件里创建新的样式

  

2)之后在AndroidManifest里声明主题为我们自定义的主题

  android:theme="@style/CustomActionBarOverlayTheme"

效果如下所示,很明显的可以看出来ActionBar的位置在In front of和Top of layout的区别,叠加模式里,布局充满了整个屏幕。

Android中ActionBar的用法详解_第3张图片


四)Action Provider的使用,ActionBar有个功能是分享按钮,先在res/menu.main.xml文件里添加这个按钮

注意指定  
然后在.java文件里,加载这个功能

	@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;
	}
	
	


效果如下

Android中ActionBar的用法详解_第4张图片




五)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;
			}
		});
	}

}

Android中ActionBar的用法详解_第5张图片 Android中ActionBar的用法详解_第6张图片


你可能感兴趣的:(Android)