1. 程式人生 > >安卓筆記之PagerSlidingTabStrip

安卓筆記之PagerSlidingTabStrip

今天學習了一下開源框架PagerSlidingTabStrip


這個框架很實用,用的也很廣。就是有點小缺陷,如果你直接用它的jar包的話,他的原始碼中預設的標籤字型和顏色不能夠修改,而且還沒有提供設定的方法。

private int tabTextSize 12;//預設的tab字型大小
private int tabTextColor 0xFF666666;//預設的顏色

庫檔案匯入

如果你在專案中需要修改它的標籤屬性的話最好還是別用jar包,直接依賴它的庫檔案。

首先把github中的原始碼下載下來,然後找到library資料夾,把它匯入的當前的專案所處的project中,然後將library

改為PagerSlidingTabStrip修改一下這個庫檔案的gradle

android {
    compileSdkVersion 你自己的buildToolsVersion 你自己的defaultConfig {
        minSdkVersion 15targetSdkVersion 你自己的}

在你的專案的gradle中新增

compile project(':PagerSlidingTabStrip')

再同步一下,這樣就可以用了。

PagerSlidingTabStrip的使用

用法很簡單,把它當作一個普通的控制元件就可以了

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context="com.example.admin.myapplication.MainActivity">
<com.astuetz.PagerSlidingTabStrip
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:id="@+id/pagerSliding"
    app:pstsIndicatorColor="@color/colorPrimaryDark"
    android:layout_height="40dp">
</com.astuetz.PagerSlidingTabStrip>

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:id="@+id/viewPager"
        android:layout_height="match_parent">

    </android.support.v4.view.ViewPager>

</RelativeLayout>


在使用的時候一定要注意viewPagersetAdapter方法一定要在mPagerSlidingTabStrip.setViewPager(mViewPager);的前面執行,不然會出現空指標。

public class MainActivity extends Activity {
    private PagerSlidingTabStrip mPagerSlidingTabStrip;
    private ViewPager mViewPager;
    private HomeAdapter mHomeAdapter;
    private String[] mMainTitles={"主頁","娛樂","科技","美食","新聞"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
    }

    private void initData() {
        mHomeAdapter=new HomeAdapter();
        mViewPager.setAdapter(mHomeAdapter);
        mPagerSlidingTabStrip.setViewPager(mViewPager);//要在setAdapter的後面執行
    }

    private void initView() {
        mPagerSlidingTabStrip = (PagerSlidingTabStrip) findViewById(R.id.pagerSliding);
        mViewPager = (ViewPager) findViewById(R.id.viewPager);
    }

       private class HomeAdapter extends PagerAdapter{
        @Override
        public int getCount() {
            if(mMainTitles!=null)
            return mMainTitles.length;
            return 0;
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view==object;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            TextView textView=new TextView(UIUtils.getContext());
            textView.setText(mMainTitles[position]);
            return textView;
        }

        /**
         * 必須要重寫此方法
         * @param position
         * @return
         */
        @Override
        public CharSequence getPageTitle(int position) {
            return mMainTitles[position];
        }
    }


如何改成你想要的PagerSlidingTabStrip

如果你想要為在滑動的同時改變標籤的字型和顏色,可以通過以下方式:

在原始碼中新增以下屬性
private int tabSelectedSize=18;//選擇時的字型大小
private int tabSelectedColor=0x1F00ff00;//選擇時的字型顏色
private int mSelectedPosition;//被選擇的下標

在原始碼的attr.xml檔案中新增

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="PagerSlidingTabStrip">
        <attr name="pstsIndicatorColor" format="color" />
        <attr name="pstsUnderlineColor" format="color" />
        <attr name="pstsDividerColor" format="color" />
        <attr name="pstsIndicatorHeight" format="dimension" />
        <attr name="pstsUnderlineHeight" format="dimension" />
        <attr name="pstsDividerPadding" format="dimension" />
        <attr name="pstsTabPaddingLeftRight" format="dimension" />
        <attr name="pstsScrollOffset" format="dimension" />
        <attr name="pstsTabBackground" format="reference" />
        <attr name="pstsShouldExpand" format="boolean" />
        <attr name="pstsTextAllCaps" format="boolean" />
        <!--新增字型的屬性-->
        <attr name="tabSelectedColor" format="color"/>
        <attr name="tabSelectedSize" format="dimension"/>
        <attr name="tabTextSize" format="dimension"/>
        <attr name="tabTextColor" format="color"/>

    </declare-styleable>

</resources>


在原始碼中的新增這寫程式碼到其他屬性相同位置

tabTextColor=a.getColor(R.styleable.PagerSlidingTabStrip_tabTextColor,tabTextColor);
tabSelectedColor=a.getColor(R.styleable.PagerSlidingTabStrip_tabSelectedColor,tabSelectedColor);
tabTextSize=a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_tabTextSize,tabTextSize);
tabSelectedSize=a.getDimensionPixelSize(R.styleable.PagerSlidingTabStrip_tabSelectedSize,tabSelectedSize);


PageListener類中

@Override
public void onPageSelected(int position) {
if (delegatePageListener != null) {
delegatePageListener.onPageSelected(position);
}
mSelectedPosition = position;//將mselectedPosition的值改為當前的position
updateTabStyles();//更新標籤樣式
}


在updateTabStyles()

private void updateTabStyles() {

for (int i = 0; i < tabCount; i++) {

View v = tabsContainer.getChildAt(i);

v.setBackgroundResource(tabBackgroundResId);

if (v instanceof TextView) {

TextView tab = (TextView) v;
tab.setTextSize(TypedValue.COMPLEX_UNIT_PX, tabTextSize);
tab.setTypeface(tabTypeface, tabTypefaceStyle);
tab.setTextColor(tabTextColor);

// setAllCaps() is only available from API 14, so the upper case is made manually if we are on a
// pre-ICS-build
if (textAllCaps) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
tab.setAllCaps(true);
} else {
tab.setText(tab.getText().toString().toUpperCase(locale));
}
}
/**
 * 如果當前選中,更改字型樣式
 */
if(i==mSelectedPosition){
tab.setTextSize(TypedValue.COMPLEX_UNIT_PX, tabSelectedSize);
tab.setTextColor(tabSelectedColor);
}
}


}

}


之後就可以用了

<com.astuetz.PagerSlidingTabStrip
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:id="@+id/pagerSliding"
    app:tabTextColor="@color/colorAccent"
    app:tabSelectedColor="#00ff00"
    app:tabTextSize="14sp"
    app:tabSelectedSize="16sp"
    app:pstsIndicatorColor="@color/colorPrimaryDark"
    app:pstsIndicatorHeight="2dp"
    android:layout_height="40dp">
</com.astuetz.PagerSlidingTabStrip>