一、前期基础知识储备
前面一篇文章里《ViewPager和ViewPager+Fragment联合使用方法精炼详解》,笔者详细介绍了,ViewPager的使用方式,包括和Fragment的搭配使用,基本上做到了一个仿微信的切换效果,但是实现方式不够优雅,要分别为菜单栏和ViewPager设置监听事件,处理起来稍显麻烦,今天本节文章将分析另一个控件PagerSlidingTapStrip,该控件+ViewPager可以更为优雅的实现上述的效果,而不用来回设置监听事件,所有的逻辑都已封装到了PagerSlidingTabStrip.setViewPager()方法里。
二、上代码,具体实现
第一步:build.gradle文件中添加依赖;
compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
第二步:创建三个碎片布局;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F44336"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
android:gravity="center"
android:textColor="#d9d8d8"
android:textSize="54sp"
android:textStyle="bold" />
</LinearLayout>
由于代码重复,就不全贴出来了;
第三步:创建三个碎片,引入碎片布局;
public class OneFragment extends Fragment {
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.view_one, null);
return view;
}
}
由于代码重复,就不全贴出来了;
第四步:创建ViewPager的适配器——核心代码;
public class MyPagerAdapter extends FragmentPagerAdapter {
private Fragment[] mFragments;
private String[] mTitles;
//这段构造器,在创建适配器时就会提示进行复写,这里我们传入三个参数
//用户看的见的界面,可以来自于静态布局,可以来自于Java代码动态设置,也可以来自适配器
public MyPagerAdapter(FragmentManager fm, Fragment[] fragments, String[] titles) {
super(fm);
this.mFragments = fragments;
this.mTitles = titles;
}
@Override
public Fragment getItem(int position) {
return mFragments[position];
}
@Override
public int getCount() {
return mFragments.length;
}
//使用ViewPager+PagerSildingTapStrip时必须复写
public CharSequence getPageTitle(int position) {
return mTitles[position];
}
}
这里,我们继承自碎片专属的适配器FragmentPagerAdapter,并且创建有三个参数的构造器——①碎片管理器,FragmentManager;②碎片实体,fragments;③指示标题栏,titles;并且要复写三个重要的方法;
第五步:创建主布局文件;
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
tools:context="com.example.administrator.douban.MainActivity">
<com.astuetz.PagerSlidingTabStrip xmlns:tab="http://schemas.android.com/apk/res-auto"
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#fafafa"
android:paddingBottom="10dp"
android:paddingTop="10dp"
android:textColor="#333333"
android:textSize="13sp"
tab:pstsDividerColor="#ed6865"
tab:pstsIndicatorColor="#9e9b9b"
tab:pstsIndicatorHeight="2dp"
tab:pstsShouldExpand="true"
tab:pstsTabBackground="@android:color/transparent"
tab:pstsUnderlineColor="@android:color/transparent" />
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
</LinearLayout>
这里,我们对PagerSildingTapStrip的属性进行了详细的设计,文章下面会对属性进行详细讲解
第六步:创建主Activity;
public class MainActivity extends AppCompatActivity {
private PagerSlidingTabStrip mPagerSlidingTabStrip;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
android.support.v7.app.ActionBar actionBar = getSupportActionBar();
if(actionBar != null){
actionBar.hide();
}
mPagerSlidingTabStrip = (PagerSlidingTabStrip) findViewById(R.id.tab);
mViewPager = (ViewPager) findViewById(R.id.viewPager);
//初始化数据——碎片布局和标题栏
Fragment[] fragments = {new OneFragment(),new TwoFragment(),new ThreeFragment()};
String[] titles = {"主页", "娱乐", "科技",};
//为ViewPager绑定碎片适配器,同时为PagerSlidingTabStrip绑定ViewPager
//注意第二个绑定方法要执行在第一个适配器绑定方法之后
MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), fragments, titles);
mViewPager.setAdapter(adapter);
mPagerSlidingTabStrip.setViewPager(mViewPager);
}
}
在主Activity代码中,我们创建碎片实例,标题实例,并且分别绑定
①ViewPager和适配器;
②PagerSildingTapStrip和ViewPager,注意两次绑定的顺序千万不能弄反,否则会报错。
运行效果如下:
下面对PagerSildingTapStrip的属性进行说明:
android:textColorPrimary 文字颜色
pstsIndicatorColor 滑动指示器颜色
pstsIndicatorHeight 滑动指示器高度
pstsUnderlineColor 视图的底部的全宽线的颜色
pstsUnderlineHeight 视图的底部的全宽线的高度
pstsDividerColor 选项卡之间的分隔线的颜色
pstsDividerWidth 选项卡之间的分隔线的宽度
pstsDividerPadding 选项卡之间的分隔线的Pading填充
pstsShouldExpand 如果设置为true,每个选项卡都是相同的weight,即LinearLayout的权重一样,默认为false
pstsScrollOffset 滑动Tab的偏移量
pstsPaddingMiddle 如果true,视图的标签会以居中显示的方式呈现。
pstsTabPaddingLeftRight 每个标签左右填充宽度
pstsTabBackground 每个标签的背景,应该是一个selector,checked=”true/false”对应不同的背景
pstsTabTextSize Tab标签的文字大小
pstsTabTextColor Tab标签的文字颜色
pstsTabTextStyle
pstsTabTextAllCaps 如果为true,所有标签都是大写字母,默认为true
pstsTabTextAlpha 设置文本alpha透明度不选中的选项卡。0 . . 255之间,150是默认值。
pstsTabTextFontFamily Tab标签文字的字体
setTypeface(Typeface typeface, int style) 设置字体,把字体放入assets里通过该方法调用
读者可以参考下图:来源:《【Android开源库】 PagerSlidingTabStrip从头到脚》,讲解的十分详细!