TabLayout+ViewPager+Fragment 实现首页滑动(实战)

概述

TabLayout 是 Google 官方在 14 年 Google I/O 大会上推出的具有 Material   Design 效果的一个控件库,作为一个标签指示器,它可以与 ViewPager 进行联动,两者配合 Fragment 使用可以实现滑动标签页,就是类似知乎和微信那种。

实现过程

  1. 首先我们需要在 app 的 gradle  中添加 design 包的依赖库:

    compile 'com.android.support:design:25.0.0'
  2. 好,我们来看看主页面 activity_main.xml 的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
   android:id="@+id/linearlay"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical">
<android.support.design.widget.TabLayout
   android:id="@+id/mtablayout"
   android:background="@color/colorPrimary"
   app:tabGravity="fill"
   app:tabIndicatorColor="@color/colorAccent"
   app:tabMode="fixed"
   app:tabTextColor="@android:color/white"
   app:tabSelectedTextColor="@color/colorAccent"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
</android.support.design.widget.TabLayout>
 <android.support.v4.view.ViewPager
 android:id="@+id/mviewpager"
 android:layout_width="match_parent"
 android:layout_height="0dp"
 android:layout_weight="1">
   </android.support.v4.view.ViewPager>
   </LinearLayout>
   </RelativeLayout>`

这里需要注意一下,为了实现如效果图中更改标示线的颜色,标题的颜色大小,以及整个 TabLayout 的背景颜色等等,我们需要在布局的开头添加命名空间:

`xmlns:app="http://schemas.android.com/apk/res-auto"`;

这里还有一些属性:  app:tabMode="fixed"     表示顶部的tab布局不可滑动  app:tabIndicatorColor="@color/colorAccent"  表示顶部Tab 下方那条线的颜色  app:tabSelectedTextColor="@color/colorAccent"  表示Tab 被选中时候字体的                                                                              颜色  app:tabTextColor="@android:color/white"   表示Tab 未被选中时候字体的颜色

3.核心代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //        去除阴影
        getSupportActionBar().setElevation(0);
         initData();
        initView();
    }
//数据初始化
  private void initData() {
        mtitle = new ArrayList<>();
        mtitle.add("服务管家");
        mtitle.add("微信精选");
        mtitle.add("美女社区");
        mtitle.add("个人中心");
        mfragment = new ArrayList<>();
        mfragment.add(new ButerFragment());
        mfragment.add(new GirlFragment());
        mfragment.add(new WeChatFragmeent());
        mfragment.add(new UserFragment());
    }
//View 初始化
private void initView() {
    mtablayout = (TabLayout) findViewById(R.id.mtablayout);
    mviewpager = (ViewPager) findViewById(R.id.mviewpager);
    //       预加载
        mviewpager.setOffscreenPageLimit(mfragment.size());
    //       设置适配器
        mviewpager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override

//
            public Fragment getItem(int position) {
                return mfragment.get(position);
            }

            @Override
            public int getCount() {
                return mfragment.size();
            }

            @Override
            public CharSequence getPageTitle(int position) {
                return mtitle.get(position);
            }
        });
    //将TabLayout 与ViewPager进行绑定
     mtablayout.setupWithViewPager(mviewpager);
}

以上就是 TabLayout+ViewPager+Fragment  实现 Tab 滑动的核心代码,ViewPager 设置 Adapter 填充  Fragment(需要准备好四个 Fragment 并加载到一个集合中),然后再将 TabLayout  与 ViewPager  进行绑定就可以了。
在这个过程中,TabLayout 是一个标签指示器,ViewPager 充当容器的角色,Fragment 为 ViewPager 提供数据源。我是这样理解的,这个场景好比将一个装满了书籍和文具「Fragment来填充」的包「ViewPager」挂在墙上的挂钩「TabLayout」上,怎么样,这样应该很容易理解了吧?

  • 需要注意的是,在 Fragment 和 ViewPager 配合使用的时候,ViewPager 会使用预加载机制,使得我们在没有跳转到对应页面时,可能已经加载好了,这是个非常不好的用户体验,浪费用户的流量。

    这样,我们便实现了首页滑动的功能,好,我们来看下效果怎么样!

  1. 接下来为了实现更加高逼格一点的效果,我们再来使用一个 FloatingActionButton 控件「悬浮框」,第一页悬浮框不可见,其他三页可见并可以实现点击事件进入设置页面「新的 一个Activity」。

    * 我们来看看该控件的布局文件:

<android.support.design.widget.FloatingActionButton
     android:id="@+id/fab_setting"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:src="@mipmap/ic_launcher_round"
     android:layout_alignParentBottom="true"
     android:layout_alignParentRight="true"
     android:layout_marginRight="15dp"
     android:layout_marginBottom="15dp" >
</android.support.design.widget.FloatingActionButton>

这些属性很简单,相信大家都知道,效果就相当于一个 Boutton 悬浮在这页面底部。

  • 核心代码:

//        初始化悬浮框
         fab_setting = (FloatingActionButton) findViewById(R.id.fab_setting);
 //        设置启动 Activity 时悬浮框默认隐藏
         fab_setting.setVisibility(View.GONE);
 //      悬浮框的点击事件
        fab_setting.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view){
                  startActivity(new Intent(this, SettingActivity.class));
            }
       });
 //     viewPager的滑动监听
         mviewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener(){
 
             @Override
             public void onPageScrolled(int position, float positionOffset, int                   positionOffsetPixels) {
             }
 
             @Override
             public void onPageSelected(int position) {
                 Log.i(TAG, "position: "+position);
                 if (position == 0) {
                     fab_setting.setVisibility(View.GONE);
                 }else {
                     fab_setting.setVisibility(View.VISIBLE);
                 }
             }
 
             @Override
             public void onPageScrollStateChanged(int state) {
 
             }
         });

代码很简单,主要就是调用 addOnPageChangeListener()方法为 viewPager 设置一个滑动监听器,需要注意的是重写的三个方法:

(1) onPageSelected( ): 表示页面被选中的那个过程

(2)onPageScrollStateChanged( ): 表示页面的滑动状态发生改变的那个过程,

(3)onPageScrolled( ):表示页面滑动的那个过程

  • 效果图如何:

    第一次录制 Gif  动态图,效果不是很理想,将就一下,我相信大家能看懂,以后我会慢慢改进!

PS:本文属于原创,欢迎一起交流学习,一起进步!如果疑问,可以关注我的微信公众号(半夏薄荷澜),在后台和我交流。

  人生没有白走的路,每一步都算数!

发布了8 篇原创文章 · 获赞 9 · 访问量 6202

猜你喜欢

转载自blog.csdn.net/DolphKong/article/details/81085920