轉載請註明出處:http://blog.csdn.net/xiaanming/article/details/9971721html
你們都知道Android的ActionBar是在3.0以上纔有的,那麼在3.0如下呢,google並無給我提供在3.0如下支持ActionBar的包,可是外國的大牛JakeWharton實現了在3.0如下使用ActionBar, JakeWharton這位大牛是ActionBarSherlock,Android-ViewPagerIndicator ,NineOldAndroids的做者,很是厲害的一我的,Github的關注量超過2.6K,我左側的友情連接裏面有他的Github的主頁連接,有興趣的朋友能夠去follow下他,今天咱們使用的是他的開源框架ActionBarSherlock,ActionBarSherlock是讓Action Bar功能支持2.X後的全部平臺,並且他會自動的判斷是調用原生Action Bar仍是使用擴展ActionBar,不少知名的應用也使用這個庫,我以前對ActionBar也不瞭解,因此就去下了ActionBarSherlock來好好的瞭解瞭解ActionBar的使用java

把紅色框框標記的文件導入Eclipse裏面,咱們能夠先看下例子,來了解下ActionBar的一些使用狀況android
- 咱們新建一個Android工程,叫ViewPagerAndTab,而後指定ActionBarSherlock爲ViewPagerAndTab的庫工程,右鍵工程--->Properties

經過上面的幾步咱們就指定ActionBarSherlock爲ViewPagerAndTab的庫工程,接下來咱們就能在3.0如下使用ActionBar,我這裏使用的是ActionBar Tab和ViewPager仿網易新聞,咱們看看主要代碼的編寫git
1.先看佈局文件,裏面一個ViewPager,很是簡單github
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@android:color/white">
-
- <android.support.v4.view.ViewPager
- android:id="@+id/viewPager"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content" />
-
- </RelativeLayout>
2.MainActivity代碼,點擊ActionBar的Tab,ViewPager切換不一樣的Fragment,滑動ViewPager,選中相對應的ActiionBar Tabapp
咱們使用ActionBarSherlock的時候再也不是繼承Activity,而是繼承SherlockActivity,SherlockDialogFragment,SherlockFragmentActivity等等,我這裏用到Fragment,因此繼承SherlockFragmentActivity,咱們不能隨便設置Activity的theme,之後咱們要全屏顯示的時候直接設置android:theme="@android:style/Theme.Black.NoTitleBar"
,咱們使用ActionBar就不能這樣設置了,而且不能隨便設置他的Theme,必須是Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar,或者是他們的子樣式,否則就會出java.lang.IllegalStateException異常,因此爲了自定義ActionBar的Tab,咱們必須修改其style
注意:咱們還必須刪除ViewPagerAndTab工程libs下面的android-support-v4.jar包,由於在ActionBarSherlock已經包含android-support-v4.jar框架
3.ViewPager的適配器TabPagerAdapter,由於咱們用到Fragment,因此咱們繼承FragmentStatePagerAdapter而不是PagerAdapteride
- package com.example.viewpagerandtabdemo;
-
- import java.util.List;
-
- import android.support.v4.app.Fragment;
- import android.support.v4.app.FragmentManager;
- import android.support.v4.app.FragmentStatePagerAdapter;
-
- public class TabPagerAdapter extends FragmentStatePagerAdapter {
- private List<Fragment> list;
-
-
- public TabPagerAdapter(FragmentManager fm, List<Fragment> list) {
- super(fm);
- this.list = list;
- }
-
- @Override
- public Fragment getItem(int arg0) {
- return list.get(arg0);
- }
-
- @Override
- public int getCount() {
- return list.size();
- }
-
- }
4.ItemFragment 繼承SherlockFragment,也能夠直接繼承Fragment,裏面的的佈局比較簡單,一個TextView用來顯示從Activity傳遞過來的ActionBar Tab的title函數
- package com.example.viewpagerandtabdemo;
-
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
-
- import com.actionbarsherlock.app.SherlockFragment;
-
-
- public class ItemFragment extends SherlockFragment {
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
-
- View contextView = inflater.inflate(R.layout.fragment_item, container, false);
- TextView mTextView = (TextView) contextView.findViewById(R.id.textview);
-
-
- Bundle mBundle = getArguments();
- String title = mBundle.getString("arg");
-
- mTextView.setText(title);
-
- return contextView;
- }
-
- @Override
- public void onActivityCreated(Bundle savedInstanceState) {
- super.onActivityCreated(savedInstanceState);
- }
-
- }
而後咱們將上面的Activity的theme設置成android:theme="@style/Theme.Sherlock.Light.DarkActionBar" 運行項目看看效果,下圖一是項目的效果,圖二是網易的效果


是否是相差很大呢?人家下面的指示條是紅色的,咱們作出來的是藍色的,人家選中Tab的字體顏色是紅色,咱們的不變色等等,那麼咱們要怎麼才能作出網易新聞的那樣子的效果,咱們須要改變其style,改變以下佈局
- <style name="Themes.ActionBarTab" parent="@style/Theme.Sherlock">
-
- <item name="actionBarDivider">@null</item>
-
-
- <item name="actionBarSize">45dip</item>
-
-
- <item name="actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabText</item>
-
-
- <item name="actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabView</item>
-
-
- <item name="actionBarStyle">@style/Widget.Slider.ActionBar</item>
- </style>
-
-
- <style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">
- <item name="backgroundStacked">@drawable/base_action_bar_bg</item>
- </style>
-
- <style name="Widget.Sherlock.ActionBar.TabText" parent="android:Widget.Holo.ActionBar.TabText">
- <item name="android:textColor">@drawable/selector_tabtext</item>
- <item name="android:textSize">15sp</item>
- </style>
-
- <style name="Widget.Sherlock.ActionBar.TabView" parent="Widget">
- <item name="android:background">@drawable/tab_indicator</item>
- <item name="android:paddingLeft">8dip</item>
- <item name="android:paddingRight">8dip</item>
- </style>
還有一些圖片,selector我沒有貼出來,能夠去下載代碼看看效果,改變style運行效果

好了,今天的講解到此結束,有疑問的朋友請在下面留言,有興趣的能夠看看 開源框架ViewPageIndicator 和 ViewPager 仿網易新聞客戶端Tab標籤
源碼下載,請點擊
不少朋友說本身在4.1上面怎麼設置style沒效果,首先這個庫是在2.X的機器上面使用ActionBar,3.0之後就是使用Andriod自帶的ActionBar,因此在3.0以上的系統使用的style爲android自帶的style,因此咱們要將style文件作下修改,以下
- <style name="Themes.ActionBarTab" parent="@style/Theme.Sherlock">
-
- <item name="actionBarDivider">@null</item>
- <item name="android:actionBarDivider">@null</item>
-
-
- <item name="actionBarSize">45dip</item>
- <item name="android:actionBarSize">45dip</item>
-
-
- <item name="actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabText</item>
- <item name="android:actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabText</item>
-
-
- <item name="actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabView</item>
- <item name="android:actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabView</item>
-
-
- <item name="actionBarStyle">@style/Widget.Slider.ActionBar</item>
- <item name="android:actionBarStyle">@style/Widget.Slider.ActionBar</item>
- </style>
-
-
- <style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">
- <item name="backgroundStacked">@drawable/base_action_bar_bg</item>
- <item name="android:backgroundStacked">@drawable/base_action_bar_bg</item>
- </style>
-
- <style name="Widget.Sherlock.ActionBar.TabText" parent="android:Widget.Holo.ActionBar.TabText">
- <item name="android:textColor">@drawable/selector_tabtext</item>
- <item name="android:textSize">15sp</item>
- </style>
-
- <style name="Widget.Sherlock.ActionBar.TabView" parent="Widget">
- <item name="android:background">@drawable/tab_indicator</item>
- <item name="android:paddingLeft">8dip</item>
- <item name="android:paddingRight">8dip</item>
- </style>