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

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.actionbar11up.MainActivity" >

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="ifRoom"
        android:title="@string/action_settings"
        android:icon="@drawable/ic_drawer"
       />
    
    <item
        android:id="@+id/action_search"
        android:title="@string/search"
        android:showAsAction="ifRoom"
        android:icon="@drawable/action_search"/>

</menu>
这里的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();
	}

二)默认的actionBar的风格虽然有很多,但是不一定能满足我们的特定需求,因此我们可以自定义ActionBar的风格, 为改变 action bar的背景,可以通过为 activity 创建一个自定义主题,并重写  actionBarStyle  属性来实现。 actionBarStyle  属性指向另一个样式;在该样式里,通过指定一个 drawable 资源来重写  background  属性。

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

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    
    <style 
        name="CustomActionBarTheme"
        parent="@android:style/Theme.Holo.Light.DarkActionBar"
        >
        <item name="android:actionBarStyle">@style/MyActionBarTheme</item>
    </style>
    
    <style 
        name="MyActionBarTheme"
        parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
        <item name="android:background">@drawable/actionbar_background</item>
    </style>
</resources>

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

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文件里创建新的样式

  <style 
        name="CustomActionBarOverlayTheme"
        parent="@android:style/Theme.Holo"
        >
        <item name="android:windowActionBarOverlay">true</item>
    </style>

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

  android:theme="@style/CustomActionBarOverlayTheme"

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



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

注意指定  <item  android:actionProviderClass="android.widget.ShareActionProvider ......./>

    <item 
        android:id="@+id/action_share"
        android:title="@string/share"
        android:actionProviderClass="android.widget.ShareActionProvider"
        android:showAsAction="ifRoom"/>
    

然后在.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;
	}
	
	


效果如下





五)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<String> arrayAdapter=new ArrayAdapter<String>(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;
			}
		});
	}

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值