[AS2.3.3]使用TabLayout+ViewPager实现滚动导航栏

滚动导航栏以前写过一个,使用RadioGroup+ViewPager来实现的。
而后在看来,觉得以前的写的好乱。想要重新整合一下,这边使用的新的方式来试下,就是TabLayout+ViewPager,由谷歌的官方控件来实现了。
上一篇底部导航栏的新整合也重新写了下,可以点击查看
我这边就写一个调用类来使用就好了!


效果和使用

  • 效果
    gif

  • 使用

    List<TabLayoutScrollBar.BarTab> list = new ArrayList<>();
    for (int i = 0; i < 3; i++) {
        TabLayoutScrollBar.BarTab fm = new TabLayoutScrollBar.BarTab();
        fm.setTitle("标题"+i);
        Bundle bundle = new Bundle();
        bundle.putString("title","标题"+i);
        fm.setBundle(bundle);
        fm.setFragment(new TestFragment());
        list.add(fm);
    }
    tabLayout.setSelectedTabIndicatorColor(ContextCompat.getColor(mActivity,R.color.appMainColor));
    new TabLayoutScrollBar(mActivity,viewPager,tabLayout,list)
            .IsAdaptationTextWidth(true)
            .create();

实现

首先看下基本的TabLayout+ViewPager实现

  • 布局
<?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.gjn.msdemo.test.TestActivity">

    <android.support.design.widget.TabLayout
        android:id="@+id/tl_test"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp">

    </android.support.design.widget.TabLayout>

    <view
        android:id="@+id/vp_test"
        class="android.support.v4.view.ViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>
  • 调用
{
    tabLayout = (TabLayout) findViewById(R.id.tl_test);
    viewPager = (ViewPager) findViewById(R.id.vp_test);

    mFragmentManager = ((FragmentActivity) mActivity).getSupportFragmentManager();

    viewPager.setAdapter(new ScrollBarAdapter(mFragmentManager,fs,ds));
    tabLayout.setupWithViewPager(viewPager);

}

    private class ScrollBarAdapter extends FragmentPagerAdapter{

        private List<?> fdata;
        private List<?> sdata;

        ScrollBarAdapter(FragmentManager fm,List<Fragment> data1,List<String> data2) {
            super(fm);
            fdata = data1;
            sdata = data2;
        }

        @Override
        public Fragment getItem(int position) {
            return fdata.get(position);
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            return sdata.get(position);
        }
    }

就是直接将TabLayout中关联viewpager就可以使用了

开始创建管理类

布局还是不变

首先我们需要确定每个选项的包含的title和fragment的tab选项类

    public static class BarTab{
        private String title;
        private Fragment fragment;
        private Bundle bundle;

        public BarTab(){
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public Fragment getFragment() {
            return fragment;
        }

        public void setFragment(Fragment fragment) {
            this.fragment = fragment;
        }

        public Bundle getBundle() {
            return bundle;
        }

        public void setBundle(Bundle bundle) {
            this.bundle = bundle;
        }
    }

然后创建viewpager的适配器

    private class ScrollBarAdapter extends FragmentPagerAdapter{

        ScrollBarAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return mData.get(position).getFragment();
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            return mData.get(position).getTitle();
        }
    }

最后实现管理类全部代码

import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.lang.reflect.Field;
import java.util.List;

/**
 * TabLayoutScrollBar
 * Author: gjn.
 * Time: 2018/1/8.
 */

public class TabLayoutScrollBar {
    private Activity mActivity;
    private ViewPager mViewPager;
    private TabLayout mTabLayout;
    private List<BarTab> mData;
    private FragmentManager mFragmentManager;
    private boolean IsAdaptationText = false;

    public TabLayoutScrollBar(Activity activity, ViewPager viewPager,
                              TabLayout tabLayout, List<BarTab> list){
        mActivity = activity;
        mFragmentManager = ((FragmentActivity) mActivity).getSupportFragmentManager();
        mViewPager = viewPager;
        mTabLayout = tabLayout;
        mData = list;
    }

    public void create(){
        //设置Bundle
        for (BarTab barTab : mData) {
            barTab.getFragment().setArguments(barTab.getBundle());
        }
        mViewPager.setAdapter(new ScrollBarAdapter(mFragmentManager));
        mTabLayout.setupWithViewPager(mViewPager);
        if (IsAdaptationText) {
            setTabTextViewWidth(mTabLayout);
        }
    }

    public BarTab getItme(int position){
        return mData.get(position);
    }

    public TabLayoutScrollBar IsAdaptationTextWidth(boolean b){
        IsAdaptationText = b;
        return this;
    }

    private void setTabTextViewWidth(final TabLayout tabLayout) {
        tabLayout.post(new Runnable() {
            @Override
            public void run() {
                try {
                    LinearLayout mTabStrip = (LinearLayout) tabLayout.getChildAt(0);
                    if (tabLayout.getTabMode() == TabLayout.MODE_SCROLLABLE) {
                        //dip2px
                        float scale = mActivity.getResources().getDisplayMetrics().density;
                        int dp = (int) (10 * scale + 0.5f);

                        for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                            View tabView = mTabStrip.getChildAt(i);
                            //不是设置padding 会缩成一团
                            tabView.setPadding(0, 0, 0, 0);
                            //拿到tabView的mTextView属性  tab的字数不固定一定用反射取mTextView
                            Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
                            mTextViewField.setAccessible(true);
                            TextView mTextView = (TextView) mTextViewField.get(tabView);
                            //获取textview的宽度
                            int width = mTextView.getWidth();
                            if (width == 0) {
                                mTextView.measure(0, 0);
                                width = mTextView.getMeasuredWidth();
                            }
                            //设置tabView的宽度和左右Margin(不设置Margin会整个连在一起)
                            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
                            params.width = width;
                            params.leftMargin = dp;
                            params.rightMargin = dp;
                            tabView.setLayoutParams(params);
                            //重新绘制tabView
                            tabView.invalidate();
                        }
                    } else {
                        for (int i = 0; i < mTabStrip.getChildCount(); i++) {
                            View tabView = mTabStrip.getChildAt(i);
                            //不是设置padding 会缩成一团
                            tabView.setPadding(0, 0, 0, 0);
                            //拿到tabView的mTextView属性  tab的字数不固定一定用反射取mTextView
                            Field mTextViewField = tabView.getClass().getDeclaredField("mTextView");
                            mTextViewField.setAccessible(true);
                            TextView mTextView = (TextView) mTextViewField.get(tabView);
                            //获取tabView的宽度
                            int tabwidth = tabView.getWidth();
                            if (tabwidth == 0) {
                                tabView.measure(0, 0);
                                tabwidth = tabView.getMeasuredWidth();
                            }
                            //获取textview的宽度
                            int textwidth = mTextView.getWidth();
                            if (textwidth == 0) {
                                mTextView.measure(0, 0);
                                textwidth = mTextView.getMeasuredWidth();
                            }
                            //设置margin的宽度
                            int margin = (tabwidth - textwidth) / 2;
                            //设置tabView的宽度和左右Margin(不设置Margin会整个连在一起)
                            LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) tabView.getLayoutParams();
                            params.width = tabwidth;
                            params.leftMargin = margin;
                            params.rightMargin = margin;
                            tabView.setLayoutParams(params);
                            //重新绘制tabView
                            tabView.invalidate();
                        }
                    }

                } catch (NoSuchFieldException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public static class BarTab{
        private String title;
        private Fragment fragment;
        private Bundle bundle;

        public BarTab(){
        }

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public Fragment getFragment() {
            return fragment;
        }

        public void setFragment(Fragment fragment) {
            this.fragment = fragment;
        }

        public Bundle getBundle() {
            return bundle;
        }

        public void setBundle(Bundle bundle) {
            this.bundle = bundle;
        }
    }

    private class ScrollBarAdapter extends FragmentPagerAdapter{

        ScrollBarAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return mData.get(position).getFragment();
        }

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

        @Override
        public CharSequence getPageTitle(int position) {
            return mData.get(position).getTitle();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/g777520/article/details/79241636