`

TabLayout和ViewPager结合使用

阅读更多
TabLayout是android design包内的控件;
一般情况下,它总是喜欢和ViewPager成对出现;

典型的像如下的布局:
<!-- 如果你屏幕上显示只有少数 tab 的时候,可以设置tabMode="fixed",若很多需要拖动,则设置tabMode="scroll" -->
        <!-- 如果 tabMode 设置成 scrollable 的,则tabGravity属性将会被忽略 -->
		<!-- 其他可设置属性
			app:tabIndicatorColor="#FF00FF00"
	        app:tabSelectedTextColor="#FF00FF00"
	        app:tabTextColor="#FF000000"
		 -->
        <android.support.design.widget.TabLayout
            android:id="@+id/tabLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabGravity="fill"
            app:tabMode="fixed"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
<android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />


然后就是结合了,由于我们通常在ViewPager中放置的是若干个Fragment,所以还得先实现几个Fragment,典型的像下面这个:
public class MoveFragment extends Fragment implements OnClickListener {

	private String curFlag;
	public static MoveFragment newInstance(String flag){
		MoveFragment fragment = new MoveFragment();  
        Bundle bundle = new Bundle();  
        bundle.putString("Flag", flag);
        fragment.setArguments(bundle);  
		return fragment;
	}

	public void onCreate(Bundle savedInstanceState) {  
		super.onCreate(savedInstanceState);  
		Bundle args = getArguments();
		if (args != null) {  
			 curFlag = args.getString("Flag");
		}
	} 

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		super.onCreateView(inflater, container, savedInstanceState);
		View view = inflater.inflate(R.layout.fragment_move, container,false);
		initViews(view);
		return view;
	}

	public void initViews(View view){
		TextView tv=(TextView)view.findViewById(R.id.tv);
		tv.setText(curFlag);
	}
	@Override
	public void onClick(View v) {

	}

}


接下去就可以使用了:
首先new 几个Fragment出来:
private static final String[] titles = new String[]{"Tab 1", "Tab 2","Tab 3", "Tab 4"};
.....
Fragment[] fragments = new Fragment[titles.length];
fragments[0]=MoveFragment.newInstance(titles[0]);
fragments[1]=XFragment.newInstance(titles[1]);
fragments[2]=YFragment.newInstance(titles[2]);
fragments[3]=ZFragment.newInstance(titles[3]);

然后实现一个FragmentPagerAdapter,注意,一定要重写getPageTitle方法,这样TabLayout就可以从中取到要显示的标题了:
FragmentPagerAdapter pagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
			@Override
			public int getCount() {
				return fragments.length;
			}

			@Override
			public Fragment getItem(int position) {
				return fragments[position];
			}

			@Override
		    public CharSequence getPageTitle(int position) {
		        return titles[position];
		    }
		};


剩下就是绑定了:
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
tabLayout.setupWithViewPager(viewPager);


然而偶尔也会没有ViewPager,TabLayout也会单独使用
那么这个时候需要使用addTab方法为TabLayout添加title了:
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
tabLayout.addTab(tabLayout.newTab().setText("Tab 4"));


////////////////////////////////////////////////////////////////////
//下面的内容与Tablayout无关,可以无视
///////////////////////////////////////////////////////////////////
接下去要实现一个ViewPager滑动的时候背景颜色过渡变化的效果
在网上找到一个背景颜色可以过渡变化的View,和ViewPager结合使用:
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
		viewPager.setAdapter(pagerAdapter);
		
		ColorAnimationView colorAnimationView = (ColorAnimationView) findViewById(R.id.colorAnimationView);
		 colorAnimationView.setViewPager(viewPager,titles.length,0xffFF8080,0xff8080FF,0xffffffff,0xff80ff80);
		 //you can call this method like this:
//		colorAnimationView.setViewPager(viewPager, titles.length);//use default color
        colorAnimationView.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            }

            @Override
            public void onPageSelected(int position) {
            }

            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

布局的时候需要把这个View和ViewPager重叠(FrameLayout)在一起使用,这样就能看出效果了:
<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >

        <com.widget.view.ColorAnimationView
            android:id="@+id/colorAnimationView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

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

注意ViewPager中的Fragment不要设置backgroundColor(用屁股想想也知道为什么!)

该类的源码如下:
package com.widget.view;

import android.animation.Animator;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
/**
 * 
 * @author Administrator
 * @see https://github.com/TaurusXi/GuideBackgroundColorAnimation
 */
public class ColorAnimationView extends View implements ValueAnimator.AnimatorUpdateListener, Animator.AnimatorListener {
	private static final int WHITE = 0xFFFFFFFF;
	private static final int RED = 0xffFF8080;
	private static final int BLUE = 0xff8080FF;
	private static final int GREEN = 0xff80ff80;
	private static final int DURATION = 3000;
	ValueAnimator colorAnim = null;

	private PageChangeListener mPageChangeListener;

	ViewPager.OnPageChangeListener onPageChangeListener;

	public void setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
		this.onPageChangeListener = onPageChangeListener;
	}



	/**
	 * 这是你唯一需要关心的方法
	 * @param mViewPager  你必须在设置 Viewpager 的 Adapter 这后,才能调用这个方法。
	 * @param obj ,这个obj实现了 ColorAnimationView.OnPageChangeListener ,实现回调
	 * @param count   ,viewpager孩子的数量
	 * @param colors int... colors ,你需要设置的颜色变化值~~ 如何你传人 空,那么触发默认设置的颜色动画
	 * */
	/**
	 * This is the only method you need care about.
	 * @param mViewPager  ,you need set the adpater before you call this.
	 * @param count   ,this param set the count of the viewpaper's child
	 * @param colors ,this param set the change color use (int... colors),
	 *               so,you could set any length if you want.And by default.
	 *               if you set nothing , don't worry i have already creat
	 *               a default good change color!
	 * */
	public void setViewPager(ViewPager mViewPager, int count, int... colors) {
//		this.mViewPager = mViewPager;
		if (mViewPager.getAdapter() == null) {
			throw new IllegalStateException("ViewPager does not have adapter instance.");
		}
		mPageChangeListener.setViewPagerChildCount(count);

		mViewPager.setOnPageChangeListener(mPageChangeListener);
		if (colors.length == 0) {
			createDefaultAnimation();
		} else {
			createAnimation(colors);
		}

	}

	public ColorAnimationView(Context context) {
		this(context, null, 0);

	}

	public ColorAnimationView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public ColorAnimationView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		mPageChangeListener = new PageChangeListener();
	}

	private void seek(long seekTime) {
		if (colorAnim == null) {
			createDefaultAnimation();
		}
		colorAnim.setCurrentPlayTime(seekTime);
	}

	private void createAnimation(int... colors) {
		if (colorAnim == null) {
			colorAnim = ObjectAnimator.ofInt(this,"backgroundColor", colors);
			colorAnim.setEvaluator(new ArgbEvaluator());
			colorAnim.setDuration(DURATION);
			colorAnim.addUpdateListener(this);
		}
	}

	private void createDefaultAnimation() {
		colorAnim = ObjectAnimator.ofInt(this,"backgroundColor", WHITE, RED, BLUE, GREEN);
		colorAnim.setEvaluator(new ArgbEvaluator());
		colorAnim.setDuration(DURATION);
		colorAnim.addUpdateListener(this);
	}

	@Override public void onAnimationStart(Animator animation) {

	}

	@Override public void onAnimationEnd(Animator animation) {
	}

	@Override public void onAnimationCancel(Animator animation) {

	}

	@Override public void onAnimationRepeat(Animator animation) {

	}

	@Override public void onAnimationUpdate(ValueAnimator animation) {
		invalidate();
//		long playtime = colorAnim.getCurrentPlayTime();
	}

	private class PageChangeListener implements ViewPager.OnPageChangeListener {

		private int viewPagerChildCount;

		public void setViewPagerChildCount(int viewPagerChildCount) {
			this.viewPagerChildCount = viewPagerChildCount;
		}

		public int getViewPagerChildCount() {
			return viewPagerChildCount;
		}

		@Override 
		public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

			int count = getViewPagerChildCount() - 1;
			if (count != 0) {
				float length = (position + positionOffset) / count;
				int progress = (int) (length * DURATION);
				ColorAnimationView.this.seek(progress);
			}
			// call the method by default
            if (onPageChangeListener!=null){
                onPageChangeListener.onPageScrolled(position,positionOffset,positionOffsetPixels);
            }

		}

		@Override 
		public void onPageSelected(int position) {
            if (onPageChangeListener!=null) {
                onPageChangeListener.onPageSelected(position);
            }
		}

		@Override 
		public void onPageScrollStateChanged(int state) {
            if (onPageChangeListener!=null) {
                onPageChangeListener.onPageScrollStateChanged(state);
            }
		}
	}
}


Android TabLayout 库:FlycoTabLayout
http://www.open-open.com/lib/view/open1447294190257.html


https://github.com/hugeterry/CoordinatorTabLayout

自适应Tab宽度可以滑动文字逐渐变色的TabLayout
http://www.see-source.com/blog/300000023/1624.html
分享到:
评论
1 楼 纯洁的坏蛋 2015-10-17  
来个截图吧

相关推荐

    Android中在DialogFragment内使用TabLayout+ViewPager

    `ViewPager`则是一个可以左右滑动浏览多个页面的视图,常与`TabLayout`结合使用,实现标签页的切换功能。 1. **集成TabLayout** - 在布局文件中添加`TabLayout`,并为每个标签页创建一个`Tab`。 - 设置`TabLayout...

    Android顶部导航之TabLayout和ViewPager的组合

    将`TabLayout`与`ViewPager`结合使用,可以创建出高效的顶部导航。首先,你需要在布局文件中添加`TabLayout`和`ViewPager`。然后,通过`TabLayout.setupWithViewPager(viewPager)`方法将两者关联起来,这样`...

    kotlin--利用TabLayout、ViewPager、Fragment实现滑动切换页面

    本教程将深入探讨如何使用Kotlin语言,结合TabLayout、ViewPager和Fragment技术来实现这一功能。 首先,TabLayout是Android设计支持库中的一个组件,用于展示多个标签,用户可以通过点击或滑动来切换不同的标签页。...

    AdPlayBanner在TabLayout和ViewPager中使用

    本文将详细探讨如何在TabLayout和ViewPager结合的场景下有效集成并使用AdPlayBanner,以实现广告展示与用户界面的无缝融合。 首先,我们需要了解TabLayout和ViewPager的基本概念。TabLayout是Google提供的Android...

    TabLayout+ViewPager+Fragment实现分页滑动效果Demo

    在Android开发中,`TabLayout`、`ViewPager`和`Fragment`是常用组件,它们结合可以构建出功能强大的分页滑动界面。本教程将详细解释如何利用这些组件实现一个分页滑动效果的Demo。 首先,`TabLayout`是Google推出的...

    tablayout+viewpager 的完美展示 多角度 多功能 各样式

    在Android开发中,`TabLayout`和`ViewPager`是两个非常重要的组件,它们常常结合使用以实现具有平滑切换和可定制样式的标签页视图。`TabLayout`由谷歌的Material Design库提供,用于创建符合Material Design规范的...

    TabLayout、ViewPager和Fragment实现多页面切换功能

    在这种场景下,TabLayout、ViewPager和Fragment是Android SDK提供的一组强大的工具,能够帮助开发者轻松实现这一功能。接下来,我们将深入探讨这三个组件的工作原理以及如何将它们结合使用。 **TabLayout** 是...

    TabLayout和ViewPager实现Tabs切换

    在Android应用开发中,创建一个具有可滑动标签页(Tabs)的应用界面是常见的需求,TabLayout和ViewPager的结合使用正是解决这一问题的有效方法。TabLayout是Android设计支持库中的一个组件,它提供了美观的标签页...

    Android-一个小型库有助于更轻松地将TabLayout与ViewPager一起使用

    在Android应用开发中,UI设计往往占据着重要的地位,尤其是对于复杂的交互界面,TabLayout与ViewPager的结合使用是常见的设计模式。TabLayout可以提供多标签切换功能,而ViewPager则负责管理多个页面的内容滑动。...

    Android中TabLayout+ViewPager 简单实现app底部Tab导航栏

    `TabLayout`是Android Design Support Library中的一个重要组件,它提供了美观且易于使用的标签页功能,可以与`ViewPager`结合使用,实现底部Tab栏的交互效果。本文将详细介绍如何使用`TabLayout`和`ViewPager`在...

    TabLayout+ViewPager

    将 `TabLayout` 与 `ViewPager` 结合使用,可以创建出强大的选项卡式界面。首先,你需要在布局XML文件中添加 `TabLayout` 和 `ViewPager`,然后在代码中设置它们的关联。通常,我们通过 `TabLayout....

    Tablayout+viewpager+fragment

    `TabLayout` 可以与`ViewPager` 结合使用,自动管理标签的数量和状态,与当前`ViewPager` 中的页面保持同步。 `ViewPager` 是一个用来展示可滑动的页面集合的控件,通常用于实现横向滑动的页面切换效果。它可以承载...

    TabLayout+ViewPager,切换页面,可点击,可滑动

    将 `TabLayout` 与 `ViewPager` 结合使用,可以实现更直观、友好的页面切换体验。以下是一个基本的集成步骤: 1. 在布局文件中添加 `TabLayout` 和 `ViewPager`,并为它们设置相应的 ID。 ```xml ...

    TabLayout+ViewPager轻松搞定Tab栏切换

    下面将详细介绍如何使用TabLayout和ViewPager来实现Tab栏切换。 首先,我们需要了解TabLayout的基本概念。TabLayout是Android Support Library中的一个组件,它允许我们在顶部或底部创建一个可滑动的Tab条目,用户...

    kotlin顶部导航栏(TabLayout+viewpager).zip

    TabLayout与ViewPager结合使用时,可以实现标签的滑动切换效果,同时更新与其关联的页面内容。 ViewPager是另一个重要的Android组件,它负责管理多个可以水平滑动的页面。每个页面都可以是一个独立的Fragment或...

    通过TabLayout和ViewPager实现Tab切换

    `TabLayout`和`ViewPager`是Android Support Library中的两个重要组件,它们结合使用能够轻松实现这一功能。本篇将详细介绍如何利用这两个组件来构建一个动态的、可自定义的Tab切换界面。 首先,`TabLayout`是...

    TabLayout+viewpager自定义.zip

    在Android开发中,`TabLayout` 和 `ViewPager` 是两个常用的组件,它们通常结合使用来实现页面间的切换和标签导航。本项目“TabLayout+viewpager自定义.zip”旨在教你如何自定义这两个组件,以满足特定的设计需求。...

    (TabLayout+ViewPager实现tab切换)使用示例

    - 如果需要动态添加或移除Tab,可以使用`TabLayout.addTab()`和`TabLayout.removeTab()`方法,同时更新ViewPager的适配器。 以上就是使用TabLayout和ViewPager实现tab切换的基本流程。在实际开发中,你可能会遇到...

    CoordinatorLayout+AppBarLayout+TabLayout+viewpager实现跟随隐藏tablayout功能

    在这个项目中,ViewPager与TabLayout结合,使得每个标签页的切换伴随着TabLayout的隐藏或显示。 在实际应用中,开发者首先需要在XML布局文件中定义这些组件,然后在Activity或Fragment的Java代码中进行关联和配置。...

    TabLayout+viewpager2

    将`TabLayout`和`ViewPager2`结合使用时,通常会创建一个`TabLayoutMediator`实例,将`TabLayout`和`ViewPager2`关联起来。`TabLayoutMediator`会自动同步`TabLayout`的标签和`ViewPager2`的页面。这样,当用户点击`...

Global site tag (gtag.js) - Google Analytics