Android Action Bar学习(一)--基本介绍及使用

转载请注明出处:http://blog.csdn.net/yegongheng/article/details/38488849


Action Bar 初步

       从今天开始,我们进入Android UI控件的学习阶段。首先我们来了解一下在Android开发中几乎每一个APP都会用到的一个非常重要的控件--Action Bar。Action Bar是在Android3.0之后新增的功能导航栏控件,它标识了用户当前操作界面的位置,并提供了额外的用户动作和界面导航功能。使用Action Bar的好处是可以为用户提供统一的导航操作栏,且将一些比较为重要的操作放在导航栏中方便用户操作,还有就是Action Bar可以自适应各种不同大小的屏幕,有良好的屏幕分辨率适配功能。下面是一张Android官网提供的一张Action Bar组成元素的的实例图片,并有相关的说明,如图下:

Android Action Bar学习(一)--基本介绍及使用_第1张图片

图标说明: 1、Action Bar图标;2、两个action 选项;3、overflow按钮。

基本了解了Action Bar的概念以及组成方式后,下面我们来深入地学习如何创建自己的Action Bar。

不同Android系统版本使用Action Bar的包引入问题

      由于Action Bar是Android 3.0 (API level 11)之后才引入Android API中的,所以Android3.0之前的API是没有提供Action Bar的原生类和方法。那Android SDK为了兼容不同低版本和高版本的开发,另外提供了一个第三方的jar类库--android-support-v7-appcompat.jar。它封装了Action Bar相关的类和方法,使用Android3.0以下版本的Android SDK的同学只要引入该jar包,且子类Activity继承ActionBarActivity类便可使用Action Bar了。

为界面添加ActionBar

     接下来就可以开始使用Action Bar来进行我们的开发工作了,首先要为我们的界面(Activity)引入Action Bar,第一步是在AndroidManifest.xml文件中的对应声明的Activity添加以下属性值(这里默认是基于Android4.4的API上开发的):

<!--ActionBar浅色背景 ,Android3.0版本以下使用@style/Theme.AppCompat.Light-->
 android:theme="@android:style/Theme.Holo.Light" 

添加完该属性后我们为对应的界面添加了一个浅色背景的Action Bar,对应显示的界面如图下:

Android Action Bar学习(一)--基本介绍及使用_第2张图片

若要将其换成稍微深一点的背景色,可以将属性值改成如下:

<!--ActionBar深色背景,Android3.0版本以下使用@style/Theme.AppCompat.Light.DarkActionBar-->
 android:theme="@android:style/Theme.Holo.Light.DarkActionBar" 
对应的显示的界面如图下:

Android Action Bar学习(一)--基本介绍及使用_第3张图片

如果想要对整个APP的Activity设置相同的Action Bar样式,可以在AndroidManifest.xml中的<application/>设置全局的主题,这样可以将Theme样式应用到每一个Activity上,设置方法如同上。

ActionBar图标和标题的修改及事件响应

       Action Bar显示成功后,我们接着为Action Bar设置icon和title,设置的方法一般有两种,xml设置和代码设置,XML设置方法就是在AndroidManifest.xml文件对应声明的Activity添加如下属性值:
<!--设置ActionBar图标 -->
 android:logo="@drawable/sys_icon"
<!--设置ActionBar的名称 -->
 android:label="@string/main_title"
代码设置的方法是首先通过调用上下文的getActionBar()方法获取ActionBar实例对象,然后再调用ActionBar对象的setIcon()和setTitle()方法分别设置ActionBar的图标和Title,具体的代码如下:
/**
 * 获取ActionBar实例对象,若是Android3.0之前的版本,需
 * 调用getSupportActionBar()方法获取ActionBar实例对象
*/
 ActionBar mActionBar = getActionBar();
 //设置ActionBar的icon
 mActionBar.setIcon(R.drawable.sys_icon);
 //设置ActionBar的title
 mActionBar.setTitle(R.string.main_title);
设置完成后,运行程序,界面视图效果如下:
  Android Action Bar学习(一)--基本介绍及使用_第4张图片
接着,我们为ActionBar的icon设置按钮点击事件,该点击事件一般是执行关闭本界面或直接跳转到指定界面的功能。废话不多说,我们用一个例子来实现一下,该例子实现的思路是有三个界面(Activity),分别名为MainActivity、ScreenFirstActivity和ScreenSecondActivity,三个Activity分别可跳转顺序的是MainActivity -> ScreenFirstActivity -> ScreenSecondActivity,该任务栈的管理方式如图下:
Android Action Bar学习(一)--基本介绍及使用_第5张图片
接着为ScreenSecondActivity的ActionBar的icon设置按钮点击事件,然后根据按钮点击事件执行相关操作。好了,开始我们的编码工作,首先ActionBar对象调用如下方法:
ActionBar mActionBar = getActionBar();
//是否启用ActionBar图标的导航功能
mActionBar.setDisplayHomeAsUpEnabled(true);
该方法主要作用是设置ActionBar图标是否具有导航点击事件功能,接下来重写Menu的事件响应方法onOptionsItemSelected(MenuItem item),然后执行如下操作:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
     int id = item.getItemId();
     switch (id) {
     //ActionBar Home键ID
     case android.R.id.home:
     //关闭当前界面
         finish();
	 break;
     default:
	 break;
       }
    return true;
}
在模拟器上运行实例程序,操作及效果图如下:
Android Action Bar学习(一)--基本介绍及使用_第6张图片

执行该操作栈的变化方式如图下:
Android Action Bar学习(一)--基本介绍及使用_第7张图片
       本操作通过调用finish()方法将本界面从当前Task移除并回退到ScreenFirstActivity,该操作其实和用户点击Back回退键的效果是一样的,但ActionBar icon事件响应不仅仅具有此功能,它还可以根据用户的设置跳转到目标界面。要实现此功能我们一般分为三个步骤:
       1.ActionBar对象调用setDisplayHomeAsUpEnabled(true),为ActionBar设置事件点击功能;
       2.在AndroidManifest.xml文件中声明的ScreenSecondActivity属性中指定所需要跳转的父类(例子中指定MainActivity为目标界面),具体代码如下:
<activity 
      android:name="com.androidleaf.actionbar.activity.ScreenSecondActivity"
      android:logo="@drawable/sys_icon"
      android:label="@string/main_title"
     >
        <!-- 设置点击ActionBar图标时跳转的父类Activity界面名称,Android4.1之前使用这个设置,
              Android4.1之后可以 直接使用android:parentActivityName属性设置
         -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.androidleaf.actionbar.activity.MainActivity" 
           />     
</activity>
      3.在ActionBar事件响应方法中执行如下操作:
public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		switch (id) {
		//ActionBar Home键ID
		case android.R.id.home:
			//获取跳转至父类Activity的Intent
			Intent mIntent = NavUtils.getParentActivityIntent(this);
			//判断父类Activity和本Activity是否同属于一个Task,true则直接根据Intent跳转,否则重新创建一个Task
			if (NavUtils.shouldUpRecreateTask(this, mIntent)) {  
		           TaskStackBuilder.create(this)  
		                    .addNextIntentWithParentStack(mIntent)  
		                    .startActivities();  
		       } else {  
		    	   mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
		           NavUtils.navigateUpTo(this, mIntent);  
		       }  
			break;
		default:
			break;
		}
		return true;
	}
执行完三个步骤后,我们来运行一下实例程序,执行效果如图下:
Android Action Bar学习(一)--基本介绍及使用_第8张图片

执行该操作栈的变化方式如图下:
Android Action Bar学习(一)--基本介绍及使用_第9张图片
至此,我们便实现了ActionBar事件点击跳转到指定目标界面的功能。

添加ActionBar按钮及事件响应

      除此之外,我们还可以根据具体页面需求为ActionBar添加若干Action Items,Items以文字或图标的形式显示在Action Bar的右侧,当在Action Bar上的Action Items过多时,则以OverFlow的形式将Action Items以列表的形式隐藏起来。 为ActionBar添加 Action Items实现起来也比较简单,只需要在res/menu文件夹下自定义xml布局文件,然后在对应的界面将xml文件加载进来即可。添加Action Item一般也分为三个步骤,如下:
      1. 在res/menu/文件夹下编写xml文件;
      2. 在界面(Activity)重写onCreateOptionsMenu(Menu menu)方法,并调用getMenuInflater().inflate()方法加载xml文件;
      3. 重写事件响应方法onOptionsItemSelected(MenuItem item),在该方法中根据获取到的menuItem ID执行相关操作。
我们开始步骤一,以本例子为例,我们在res/menu/文件夹在创建main.xml文件,并添加相应的代码,如下:
<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="com.androidleaf.actionbar.activity.MainActivity" >

    <item
        android:id="@+id/action_delete"
        android:orderInCategory="20"
        android:title="@string/action_delete"
        android:icon="@drawable/msg_icon_clear_all"
        android:showAsAction="always"/>
    <item
        android:id="@+id/action_tip"
        android:orderInCategory="30"
        android:title="@string/action_tip"
        android:icon="@drawable/poi_icon_action_tip"
        android:showAsAction="always"/>
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="40"
        android:title="@string/action_setting"
        android:icon="@drawable/user_icon_setting"
        android:showAsAction="ifRoom"/>
    <item
        android:id="@+id/action_send"
        android:orderInCategory="50"
        android:title="@string/action_send"
        android:icon="@drawable/title_icon_send"
        android:showAsAction="ifRoom"/>
    
</menu>
每一个item都对应一个Action Item,我们可以为每个Item设置icon、title或showAsAction等,我们先对<item/>中的属性作用做一些说明:
android:title : Action Item的标题名称;
android:icon: Action Item的图标;
android:orderInCategory: Action Item的排序类型值,用户可以使用该属性为每个<item/>设置排序的顺序,当设置的值越小,该Action Item排列的顺序越靠前,同样的,当设置的值越大,该Action Item排列的顺序越往后。
android:showAsAction: 设置Action Item显示位置类型,一般以下几个值可以选择:
       (1)always:表示该Action Item一直显示在Action Bar上,若屏幕空间不够则无法显示;
       (2)never:表示该Action Item一直隐藏在overFlow中;
       (3)ifRoom:表示Action Bar空间足够的情况下显示在Action Bar,否则隐藏在overFlow中;
       (4)withText:表示Action Item显示尽可能是文字,不过当Action Item空间不够活icon有效时,该属性则不起作用;
       (5)collapseActionView:表示Action Item是可合并的,当Action Bar有足够空间时,该Action Item和其它显示在Action Bar的Action Item显示全部,当Action Bar空间不足时,则该Action Item合并其它Action Item。collapseActionView需配合ifRoom使用。
编写完xml文件后,我们再将xml文件加载进来,具体代码如下:
@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;
	}
最后我们来实现Item的事件响应方法,具体代码如下:
@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		Resources mResources = getResources();
		switch (id) {
		case R.id.action_delete:
			showInformation(mResources.getString(R.string.action_delete));
			break;
		case R.id.action_tip:
			showInformation(mResources.getString(R.string.action_tip));
			break;
		case R.id.action_settings:
			showInformation(mResources.getString(R.string.action_setting));
			break;
		case R.id.action_send:
			showInformation(mResources.getString(R.string.action_send));
			break;
		default:
			break;
		}
		return true;
	}
至此,我们便按以上三个步骤代码编写完毕, ok,那我们先来运行一下程序看一下Action Items的效果图,如图下:
Android Action Bar学习(一)--基本介绍及使用_第10张图片
细心的读者可能会发现overFlow中的Item设置了icon,却没有显示,到底是为什么呢?其实很简单,查看源码可知,overflow中的Action item应不应该显示图标,是由MenuBuilder这个类中的setOptionalIconsVisible(boolean visible)方法来决定的.默认是false不显示,那如果要让其显示图标的话,这可以通过反射机制获取 setOptionalIconsVisible(boolean visible)并 为其设置为true就行,具体的思路是重写代码如下:
@Override
	public boolean onMenuOpened(int featureId, Menu menu) {
		// TODO Auto-generated method stub
		if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {  
			//通过发射机制根据类名获取setOptionalIconsVisible(boolean visible)方法,并为其设置true
	        if (menu.getClass().getSimpleName().equals("MenuBuilder")) {  
	            try {  
	                Method method = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);  
	                method.setAccessible(true);  
	                method.invoke(menu, true);  
	            } catch (Exception e) {  
	            }  
	        }  
	    }  
		return super.onMenuOpened(featureId, menu);
	}
然后再运行程序,效果如图下:
Android Action Bar学习(一)--基本介绍及使用_第11张图片

添加 Drop-Down Navigation

      Action Bar还提供了一个下拉导航的功能,APP有时若需要根据不同的分类来为页面加载不同的数据,Action Bar的下拉导航功能可以方便地解决该问题,下面我们来先看一下它的实际效果图,如图下:
Android Action Bar学习(一)--基本介绍及使用_第12张图片
要实现上诉功能其实也比较简单,一般分为四个步骤实现:
1、ActionBar对象调用setNavigationMode(ActionBar.NAVIGATION_MODE_LIST)方法为ActionBar设置拉下导航模式;
2、初始化适配器并绑定下拉导航列表数据;
3、创建Action Bar下拉导航事件监听类;
4、ActionBar对象调用setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback)方法,为ActionBar设置Adapter并为其设置事件监听。
下面我们就编写代码按照步骤一一实现,具体代码如下:
public class ScreenSecondActivity extends BaseActivity {

	private SpinnerAdapter mSpinnerAdapter;
	private TextView mTextView;
	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_screen_second);
		
		//是否启用ActionBar图标的导航功能
		mActionBar.setDisplayHomeAsUpEnabled(true);
		mActionBar.setTitle("");
		
		//1、设置Action Bar的导航模式
		mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
		//2、初始化适配器并绑定下拉导航列表数据
		mSpinnerAdapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.navigation_list_array,
				android.R.layout.simple_spinner_dropdown_item);
		//4、为ActionBar设置Adapter并为其设置事件监听
		mActionBar.setListNavigationCallbacks(mSpinnerAdapter, new MyOnNavigationListener());
		mTextView = (TextView)findViewById(R.id.screen_second_textview);
	 
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.screen_second, menu);
		return true;
	}

	@Override
	public boolean onMenuOpened(int featureId, Menu menu) {
		// TODO Auto-generated method stub
		if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {  
	        if (menu.getClass().getSimpleName().equals("MenuBuilder")) {  
	            try {  
	                Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);  
	                m.setAccessible(true);  
	                m.invoke(menu, true);  
	            } catch (Exception e) {  
	            }  
	        }  
	    }  
		return super.onMenuOpened(featureId, menu);
	}
	
	@SuppressLint("NewApi")
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		return true;
	}
	
	 //3、 创建Action Bar下拉导航事件监听类
	private class MyOnNavigationListener implements OnNavigationListener{

		@Override
		public boolean onNavigationItemSelected(int itemPosition, long itemId) {
			// TODO Auto-generated method stub
			switch (itemPosition) {
			case 0:
				mTextView.setText("全部");
				break;
			case 1:
				mTextView.setText("热门信息");
				break;
			case 2:
				mTextView.setText("朋友");
				break;
			case 3:
				mTextView.setText("家人");
				break;
			default:
				break;
			}
			return true;
		}
	}
}
至此,我们便实现了在ActionBar中添加下拉导航的功能。

添加Action View

       ActionBar还提供一个替换Action Item的方案--为ActionBar添加Action View。在menu的xml文件中<item/>选项里有一个android:actionViewClass属性,是专门为ActionBar添加自定义View的操作,它与Action Item相比,用户可以添加不同的ActionView,以完成更复杂丰富的功能。使用该方式最常用的应用场景就是为ActionBar设置一个SearchView搜索框,方便用户在ActionBar上执行搜索操作。下面我们也来看下它实现的效果图,如图下:
Android Action Bar学习(一)--基本介绍及使用_第13张图片
要在ActionBar中引入ActionView很简单,拿设置SearchView为例,一般分为三个步骤,如下:
1.在res/menu/screen_first.xml文件中对应的<item/>设置android:actionViewClass=“android.widget.SearchView”;
2.在ScreenFirstActivity中重写onCreateOptionsMenu(Menu menu)并在该方法中根据ID获取MenuItem实例,并调用getActionView()方法获取SearchView对象,并设置相关属性值;
3.执行搜索操作。
下面我们就编写代码按照步骤一一实现,首先res/menu/screen_first.xml文件中对应<item/>的代码如下:
<item
    android:id="@+id/action_search"
    android:title="@string/action_search"
    android:orderInCategory="20"
    android:actionViewClass="android.widget.SearchView"
    android:icon="@drawable/common_icon_search"
    android:showAsAction="ifRoom|collapseActionView"
    />
接着执行第二、三步骤的操作,具体代码如下:
MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
		//2、调用getActionView()获取SearchView对象
		SearchView mSearchView = (SearchView) searchMenuItem.getActionView();
		//获取搜索的管理对象
		SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
		//当前的Activity为可搜索的Activity
		mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
		//以默认的方式展开
		mSearchView.setIconifiedByDefault(true);
		//3、执行相关搜索操作
		//......
在这里我们只是简单地在ActionBar上引入一个SearchView,想要详细了解如何使用SearchView执行搜索操作的读者,可以阅读《Android实现Search搜索框原理分析》这篇博客。

添加Action Provider

      最后我们再介绍一种十分有用的功能--Action Provider。它类似于上面讲的下拉导航的功能,不同的是下拉导航列表只能显示文本,Action Provider它可以自定义Item的布局选项,且Android系统也提供了好几个内置的Action Provider,例如ShareActionProvider,它可以很方便地为用户提供分享应用信息的功能,还有MediaRouteActionProvider,它主要是将MediaRouteButton展示在ActionBar上,并允许用户去选择Media Route并控制当前所选择的Media Route。使用Android内置的Action Provider与添加Action View的方式差不多,这里不多介绍,感兴趣的读者可以自行实验。我们在这里来学习一下如何自定义Action Provider,来添加我们所需的功能选项。在此之前,我们来看一下自定义Action Provider在ActionBar上的效果图,如图下:

Android Action Bar学习(一)--基本介绍及使用_第14张图片

一般的,自定义Action Provider并将其添加到ActionBar分为以下三个步骤:

1.在res/menu/screen_first.xml文件中对应的<item/>设置android:actionProviderClass="com.androidleaf.actionbar.widget.MyActionProvider";

2.创建继承Action Provider的子类,并重写onCreateActionView()、hasSubMenu()和onPrepareSubMenu()方法,在onPrepareSubMenu()方法中为Action Provider添加子菜单项,并为每个子菜单项设置事件监听;

3.在ScreenFirstActivity中重写onCreateOptionsMenu(Menu menu)并在该方法中根据ID获取MenuItem实例,并调用getActionProvider()方法获取MyActionProvider对象,并为子菜单项实现事件监听;

首先实现步骤一,res/menu/screen_first.xml文件中对应的<item/>代码如下:

<item
    android:id="@+id/action_write"
    android:title="@string/action_write"
    android:orderInCategory="30"
    android:actionProviderClass="com.androidleaf.actionbar.widget.MyActionProvider"
    android:icon="@drawable/icon_title_write"
    android:showAsAction="always"
    />

再来看一下继承ActionProvider的子类MyActionProvider的代码,如下:

public class MyActionProvider extends ActionProvider {

	private Context mContext;
	
	/**
	 * 为Action Provider子菜单项的事件点击定义回调接口
	 */
	private SubMenuItemClickListener mSubMenuItemClickListener;
	
	public interface SubMenuItemClickListener{
		public void onSubMenuItem(int itemId);
	}
	
	public void setOnSubMenuItemClickListener(SubMenuItemClickListener mSubMenuItemClickListener){
		this.mSubMenuItemClickListener = mSubMenuItemClickListener;
	}
	
	MyProviderOnMenuItemClickListener mProviderOnMenuItemClickListener =
			new MyProviderOnMenuItemClickListener();

	public MyActionProvider(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		mContext = context;
	}

	@Override
	public View onCreateActionView() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean hasSubMenu() {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	public void onPrepareSubMenu(SubMenu subMenu) {
		// TODO Auto-generated method stub
		//清除子菜单实例
		subMenu.clear();
		//从XML文件中添加MenuItem
		MenuInflater menuInflater = new MenuInflater(mContext);
		menuInflater.inflate(R.menu.provider_submenu, subMenu);
		//为各项MenuItem设置事件监听
		for(int i = 0;i < subMenu.size();i++){
			subMenu.getItem(i).setOnMenuItemClickListener(mProviderOnMenuItemClickListener);
		}
	}

	private class MyProviderOnMenuItemClickListener implements
			OnMenuItemClickListener {

		@Override
		public boolean onMenuItemClick(MenuItem item) {
			// TODO Auto-generated method stub
			mSubMenuItemClickListener.onSubMenuItem(item.getItemId());
			return true;
		}

	}
}

接着在ScreenFirstActivity类中实现SubMenuItemClickListener回调接口:

public class ScreenFirstActivity extends BaseActivity implements SubMenuItemClickListener{

然后在重写onSubMenuItem(int itemId)方法,具体代码如下:

@Override
	public void onSubMenuItem(int itemId) {
		// TODO Auto-generated method stub
		switch (itemId) {
		case R.id.user_like:
			showInformation("点赞评论");
			break;
		case R.id.user_fuck:
			showInformation("Fuck评论");
			break;
		default:
			break;
		}
	}

最后在onCreateOptionsMenu(Menu menu) 中获取MyActionProvider对象并设置事件监听,具体代码如下:

 /**
 * 获取MyActionProvider对象,并设置事件监听
 */
 MenuItem writeMenuItem = menu.findItem(R.id.action_write);
 MyActionProvider myActionProvider = (MyActionProvider)writeMenuItem.getActionProvider();
 myActionProvider.setOnSubMenuItemClickListener(this);

至此,自定义ActionProvider的操作便执行完毕。

添加ActionBar Tabs

       在Android3.0之前,很多开发人员都喜欢用TabWidget结合TabHost来实现页面切换卡的功能,Android3.0引入ActionBar之后,该方法就比较少被人使用了。因为我们完全可以利用ActionBar来很方便地实现上述功能,并且Google官方也推荐使用ActionBar,因为它不仅实现起来更加方便简洁,而且也更加智能,它可以自适应屏幕的大小,当Tabs在平板上显示时,由于ActionBar的拥有充足的显示空间,Tabs会自动显示在ActionBar上,如图下:

而当在手机上显示时,由于ActionBar的显示空间不足,Tabs会显示在ActionBar下方,如图下:
Android Action Bar学习(一)--基本介绍及使用_第15张图片
接下来我们将使用ActionBar来实现一个页面切换卡(Tabs)的功能。要添加ActionBar Tabs一般分为以下三个步骤:
1.创建实现ActionBar.TabListener接口的子类,并根据Tab切换的item来动态添加或移除Fragment;
2.ActionBar调用setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)方法,设置Tabs导航模式;
3.创建ActionBar.Tab对象,为其设置ActionBar.TabListener监听器,并设置Tab的标题名称或图标;
4.将ActionBar.TAB对象添加到ActionBar中。
下面我们将按照步骤来一一实现,首先实现第一步,创建实现ActionBar.TabListener接口的子类,具体的代码如下:
public class ActionBarTabListener<T extends Fragment> implements TabListener {

	private Fragment mFragment;
	private Class<T> mFragmentClass;
	private String fragmentTag;
	private Activity mActivity;
	
	public ActionBarTabListener(Activity mActivity,String fragmentTag,Class<T> mFragmentClass){
		this.mActivity = mActivity;
		this.mFragmentClass = mFragmentClass;
		this.fragmentTag = fragmentTag;
	}
	@Override
	public void onTabSelected(Tab tab, FragmentTransaction ft) {
		// TODO Auto-generated method stub
		//如果Fragment的实例对null,则重新创建
		if(mFragment == null){
			//根据类名初始化Fragment对象
			mFragment = Fragment.instantiate(mActivity, mFragmentClass.getName());
			ft.add(android.R.id.content, mFragment,fragmentTag);
		}else{
			//当选中的Tab所对应的Fragment不为null时,则建立与Tab的依赖
			ft.attach(mFragment);
		}
	}

	@Override
	public void onTabUnselected(Tab tab, FragmentTransaction ft) {
		//当Tab别切换到另一个Tab,依附在当前Tab的Fragment如果不为null,则解除依赖
		if(mFragment != null){
			ft.detach(mFragment);
		}
	}

	@Override
	public void onTabReselected(Tab tab, FragmentTransaction ft) {
		// TODO Auto-generated method stub

	}

}
 
  接着在ScreenSecondActivity中实现第2、3、4步骤,具体的代码如下: 
 
//2、设置导航模式
 mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//3、创建ActionBar.Tab对象,为其设置ActionBar.TabListener监听器,并设置Tab的标题名称或图标
Tab mTabApp = mActionBar
	.newTab()
	.setText("应用")
	.setTabListener(new ActionBarTabListener<ApplicationFragment>(this,
			"application", ApplicationFragment.class));
Tab mTabGame = mActionBar
	.newTab()
	.setText("游戏")
	.setTabListener(new ActionBarTabListener<GameFragment>(this, "game",
			GameFragment.class));
//4、将ActionBar.TAB对象添加到ActionBar中
mActionBar.addTab(mTabApp);
mActionBar.addTab(mTabGame);
执行完四个步骤后,我们来运行一下程序,操作效果图如下:
Android Action Bar学习(一)--基本介绍及使用_第16张图片

至此,我们便成功使用ActionBar添加Tabs,是不是很简单方便!

小结:由于Action Bar所涉及到的知识比较多,且鉴于篇幅关系,本文暂且讨论以上知识点,更多关于Action Bar的知识将在下一篇文章中进行深入讨论。先来为本文学习的知识做一个小结,本文讨论的的知识点主要包括:

(1)为页面添加ActionBar;(2)ActionBar图标和标题的修改及事件响应;(3)添加ActionBar按钮及事件响应;(4)为ActionBar添加 Drop-Down Navigation;(5)为ActionBar添加Action View;(6)为ActionBar添加Action Provider;(7)添加ActionBar Tabs。


源代码下载,请戳下面:

  • GITHUB下载
  • CSDN下载

你可能感兴趣的:(Android Action Bar学习(一)--基本介绍及使用)