ActionBarSherlock框架
大家都知道 Android的ActionBar是在3.0以上才有的,那么在3.0以下呢,google并沒有給我提供在3.0以下支持ActionBar的包,但 是外國(guó)的大牛JakeWharton實(shí)現(xiàn)了在3.0以下使用ActionBar, JakeWharton這位大牛是 ActionBarSherlock,Android-ViewPagerIndicator ,NineOldAndroids的作者,非常厲害的一個(gè)人,Github的關(guān)注量超過(guò)2.6K,我左側(cè)的友情鏈接里面有他的Github的主頁(yè)鏈接,有 興趣的朋友可以去follow下他,今天我們使用的是他的開源框架ActionBarSherlock,ActionBarSherlock是讓 Action Bar功能支持2.X后的所有平臺(tái),而且他會(huì)自動(dòng)的判斷是調(diào)用原生Action Bar還是使用擴(kuò)展ActionBar,很多知名的應(yīng)用也使用這個(gè)庫(kù),我之前對(duì)ActionBar也不了解,所以就去下了 ActionBarSherlock來(lái)好好的了解了解ActionBar的使用
我們先從Github上面先下載這個(gè)庫(kù),下載地址https://github.com/JakeWharton/ActionBarSherlock,下載好了解壓如圖
把紅色框框標(biāo)記的文件導(dǎo)入Eclipse里面,我們可以先看下例子,來(lái)了解下ActionBar的一些使用情況
我們新建一個(gè)Android工程,叫ViewPagerAndTab,然后指定ActionBarSherlock為ViewPagerAndTab的庫(kù)工程,右鍵工程--->Properties
通過(guò)上面的幾步我們就指定ActionBarSherlock為ViewPagerAndTab的庫(kù)工程,接下來(lái)我們就能在3.0以下使用ActionBar,我這里使用的是ActionBar Tab和ViewPager仿網(wǎng)易新聞,我們看看主要代碼的編寫
1.先看布局文件,里面一個(gè)ViewPager,非常簡(jiǎn)單
[html] view plaincopyprint?
<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代碼,點(diǎn)擊ActionBar的Tab,ViewPager切換不同的Fragment,滑動(dòng)ViewPager,選中相對(duì)應(yīng)的ActiionBar Tab
[java] view plaincopyprint?
package com.example.viewpagerandtabdemo;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.ActionBar.Tab;
import com.actionbarsherlock.app.SherlockFragmentActivity;
public class MainActivity extends SherlockFragmentActivity implements ActionBar.TabListener, OnPageChangeListener{
/**
* 頂部Tab的title
*/
private String [] mTabTitles;
/**
* ViewPager對(duì)象的引用
*/
private ViewPager mViewPager;
/**
* 裝載Fragment的容器,我們的每一個(gè)界面都是一個(gè)Fragment
*/
private List
/**
* ActionBar對(duì)象的引用
*/
private ActionBar mActionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//從資源文件在獲取Tab的title
mTabTitles = getResources().getStringArray(R.array.tab_title);
mFragmentList = new ArrayList
mViewPager = (ViewPager) findViewById(R.id.viewPager);
//設(shè)置Adapter
mViewPager.setAdapter(new TabPagerAdapter(getSupportFragmentManager(), mFragmentList));
//設(shè)置監(jiān)聽
mViewPager.setOnPageChangeListener(this);
//獲取Action實(shí)例我們使用getSupportActionBar()方法
mActionBar = getSupportActionBar();
//隱藏Title
mActionBar.setDisplayShowTitleEnabled(false);
//隱藏Home logo
mActionBar.setDisplayShowHomeEnabled(false);
//設(shè)置ActionBar的導(dǎo)航模式為Tab
mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
//為ActionBar添加Tab并設(shè)置TabListener
for(int i=0; i
ActionBar.Tab tab = mActionBar.newTab();
tab.setText(mTabTitles[i]);
tab.setTabListener(this);
mActionBar.addTab(tab, i);
}
//將Fragment加入到List中,并將Tab的title傳遞給Fragment
for(int i=0; i
Fragment fragment = new ItemFragment();
Bundle args = new Bundle();
args.putString("arg", mTabTitles[i]);
fragment.setArguments(args);
mFragmentList.add(fragment);
}
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
//點(diǎn)擊ActionBar Tab的時(shí)候切換不同的Fragment界面
mViewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageSelected(int arg0) {
//滑動(dòng)ViewPager的時(shí)候設(shè)置相對(duì)應(yīng)的ActionBar Tab被選中
mActionBar.setSelectedNavigationItem(arg0);
}
}
我 們使用ActionBarSherlock的時(shí)候不再是繼承Activity,而是繼承 SherlockActivity,SherlockDialogFragment,SherlockFragmentActivity等等,我這里用到 Fragment,所以繼承SherlockFragmentActivity,我們不能隨便設(shè)置Activity的theme,以后我們要全屏顯示的時(shí) 候直接設(shè)置android:theme="@android:style/Theme.Black.NoTitleBar", 我們使用ActionBar就不能這樣設(shè)置了,并且不能隨便設(shè)置他的Theme,必須是Theme.Sherlock, Theme.Sherlock.Light, Theme.Sherlock.Light.DarkActionBar,或者是他們的子樣式,不然就會(huì)出 java.lang.IllegalStateException異常,所以為了自定義ActionBar的Tab,我們必須修改其style
注意:我們還必須刪除ViewPagerAndTab工程libs下面的android-support-v4.jar包,因?yàn)樵贏ctionBarSherlock已經(jīng)包含android-support-v4.jar
3.ViewPager的適配器TabPagerAdapter,因?yàn)槲覀冇玫紽ragment,所以我們繼承FragmentStatePagerAdapter而不是PagerAdapter
[java] view plaincopyprint?
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
//構(gòu)造函數(shù)
public TabPagerAdapter(FragmentManager fm, 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,里面的的布局比較簡(jiǎn)單,一個(gè)TextView用來(lái)顯示從Activity傳遞過(guò)來(lái)的ActionBar Tab的title
[java] view plaincopyprint?
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);
//獲取Activity傳遞過(guò)來(lái)的參數(shù)
Bundle mBundle = getArguments();
String title = mBundle.getString("arg");
mTextView.setText(title);
return contextView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
然后我們將上面的Activity的theme設(shè)置成android:theme="@style/Theme.Sherlock.Light.DarkActionBar" 運(yùn)行項(xiàng)目看看效果,下圖一是項(xiàng)目的效果,圖二是網(wǎng)易的效果
是不是相差很大呢?人家下面的指示條是紅色的,我們做出來(lái)的是藍(lán)色的,人家選中Tab的字體顏色是紅色,我們的不變色等等,那么我們要怎么才能做出網(wǎng)易新聞的那樣子的效果,我們需要改變其style,改變?nèi)缦?/span>
[html] view plaincopyprint?
<style name="Themes.ActionBarTab" parent="@style/Theme.Sherlock">
<item name="actionBarDivider">@nullitem>
<item name="actionBarSize">45dipitem>
<item name="actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabTextitem>
<item name="actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabViewitem>
<item name="actionBarStyle">@style/Widget.Slider.ActionBaritem>
style>
<style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">
<item name="backgroundStacked">@drawable/base_action_bar_bgitem>
style>
<style name="Widget.Sherlock.ActionBar.TabText" parent="android:Widget.Holo.ActionBar.TabText">
<item name="android:textColor">@drawable/selector_tabtextitem>
<item name="android:textSize">15spitem>
style>
<style name="Widget.Sherlock.ActionBar.TabView" parent="Widget">
<item name="android:background">@drawable/tab_indicatoritem>
<item name="android:paddingLeft">8dipitem>
<item name="android:paddingRight">8dipitem>
style>
還有一些圖片,selector我沒有貼出來(lái),可以去下載代碼看看效果,改變style運(yùn)行效果
好了,今天的講解到此結(jié)束,有疑問(wèn)的朋友請(qǐng)?jiān)谙旅媪粞?有興趣的可以看看 開源框架ViewPageIndicator 和 ViewPager 仿網(wǎng)易新聞客戶端Tab標(biāo)簽
很 多朋友說(shuō)自己在4.1上面怎么設(shè)置style沒效果,首先這個(gè)庫(kù)是在2.X的機(jī)器上面使用ActionBar,3.0以后就是使用Andriod自帶的 ActionBar,所以在3.0以上的系統(tǒng)使用的style為android自帶的style,所以我們要將style文件做下修改,如下
[html] view plaincopyprint?
<style name="Themes.ActionBarTab" parent="@style/Theme.Sherlock">
<item name="actionBarDivider">@nullitem>
<item name="android:actionBarDivider">@nullitem>
<item name="actionBarSize">45dipitem>
<item name="android:actionBarSize">45dipitem>
<item name="actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabTextitem>
<item name="android:actionBarTabTextStyle">@style/Widget.Sherlock.ActionBar.TabTextitem>
<item name="actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabViewitem>
<item name="android:actionBarTabStyle">@style/Widget.Sherlock.ActionBar.TabViewitem>
<item name="actionBarStyle">@style/Widget.Slider.ActionBaritem>
<item name="android:actionBarStyle">@style/Widget.Slider.ActionBaritem>
style>
<style name="Widget.Slider.ActionBar" parent="@style/Widget.Sherlock.ActionBar">
<item name="backgroundStacked">@drawable/base_action_bar_bgitem>
<item name="android:backgroundStacked">@drawable/base_action_bar_bgitem>
style>
<style name="Widget.Sherlock.ActionBar.TabText" parent="android:Widget.Holo.ActionBar.TabText">
<item name="android:textColor">@drawable/selector_tabtextitem>
<item name="android:textSize">15spitem>
style>
<style name="Widget.Sherlock.ActionBar.TabView" parent="Widget">
<item name="android:background">@drawable/tab_indicatoritem>
<item name="android:paddingLeft">8dipitem>
<item name="android:paddingRight">8dipitem>
style>
推薦文章
2025-01-18
2024-11-28
2024-11-09
2024-10-25
2024-06-25
2024-01-04
2023-11-06
2023-10-30
2023-10-13
2023-10-10
穩(wěn)定
產(chǎn)品高可用性高并發(fā)貼心
項(xiàng)目群及時(shí)溝通專業(yè)
產(chǎn)品經(jīng)理1v1支持快速
MVP模式小步快跑承諾
我們選擇聲譽(yù)堅(jiān)持
10年專注高端品質(zhì)開發(fā)聯(lián)系我們
友情鏈接: