ViewPager+Fragment+FlycoTabLayout,20行代码实现tabbar(菜单切换效果)

前言

首先上鸡汤,FlycoTabLayout,一个强大的第三方tabbar库(有各种体位,总有个姿势会让你舒适),点击查看相信你不会后悔。

正如标题所说,只需要不到20行的代码,实现tabbar,菜单选择效果,先上图。 

编码

  • 首先创建一个项目

  • 布局,很简单

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tl="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        tools:context="com.lpf.fvp.MainActivity"
        tools:showIn="@layout/activity_main">
    
        <com.flyco.tablayout.SlidingTabLayout
            android:id="@+id/tablayout"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            android:background="?attr/colorPrimary"
            tl:tl_divider_color="#1AFFFFFF"
            tl:tl_divider_padding="13dp"
            tl:tl_divider_width="1dp"
            tl:tl_indicator_color="#FFFFFF"
            tl:tl_indicator_height="1.5dp"
            tl:tl_indicator_width_equal_title="true"
            tl:tl_tab_padding="22dp"
            tl:tl_tab_space_equal="true"
            tl:tl_textSelectColor="#FFFFFF"
            tl:tl_textUnselectColor="#66FFFFFF"
            tl:tl_underline_color="#1AFFFFFF"
            tl:tl_underline_height="1dp" />
    
        <android.support.v4.view.ViewPager
            android:id="@+id/view_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

    具体控件的使用请查看源项目FlycoTabLayout,有详细的介绍,在此不多说。

  • 创建一个fragment

    public class MyFragment extends Fragment {
        private View view;
        private String title;
        private TextView txt;
    
        public static MyFragment getInstance(String title) {
            MyFragment mf = new MyFragment();
            mf.title = title;
            return mf;
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            view = inflater.inflate(R.layout.fragment_layout, container, false);
            return view;
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            initView();
        }
    
        private void initView() {
            txt = (TextView) view.findViewById(R.id.msg);
            txt.setText(title);
        }
    }
    <?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:orientation="vertical">
    
        <TextView
            android:id="@+id/msg"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center" />
    
    </LinearLayout>

    此处应该不存在任何疑惑,绑定布局,获取一个textview而已。

  • 主界面,MainActivity代码实现

    public class MainActivity extends AppCompatActivity {
    
        @InjectView(R.id.toolbar)
        Toolbar toolbar;
        @InjectView(R.id.tablayout)
        SlidingTabLayout tablayout;
        @InjectView(R.id.view_pager)
        ViewPager viewPager;
        @InjectView(R.id.fab)
        FloatingActionButton fab;
    
        private ArrayList<MyFragment> mFagments = new ArrayList<>();
        private String[] mTitles = {"Tab1", "Tab2", "Tab333344", "Tab4", "Tab5", "Tab6"};
    
        private MyPagerAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ButterKnife.inject(this);
            setSupportActionBar(toolbar);
    
            initView();
        }
    
        private void initView() {
            for (String s : mTitles) {
                mFagments.add(MyFragment.getInstance(s));
            }
            //getChildFragmentManager() 如果是嵌套在fragment中就要用这个
            adapter = new MyPagerAdapter(getSupportFragmentManager());
            viewPager.setAdapter(adapter);
            tablayout.setViewPager(viewPager, mTitles);
        }
    
        private class MyPagerAdapter extends FragmentPagerAdapter {
            public MyPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            @Override
            public int getCount() {
                return mFagments.size();
            }
    
            @Override
            public CharSequence getPageTitle(int position) {
                return mTitles[position];
            }
    
            @Override
            public Fragment getItem(int position) {
                return mFagments.get(position);
            }
        }
    }

    这里就说一下MyPagerAdapter,用于viewpager绑定fragment使用,在activity中FragmentManager通过getSupportFragmentManager()去获取,如果在是在fragment中就需要通过getChildFragmentManager()去说去。 
    我想又得开始吐槽了,特麽这只有20行代码?哈哈,刨去初始化控件啊什么乱七八糟的,真的没有20行,亲自数过。

  • 其他同方法实现的效果 

补充

  • 补充说明

    可能有人会思考,你这现有的布局,都长的差不多,可以使用一个fragment绑定就可以了,如何使用多个fragment,绑定不同的页面呢?简单啦…

  • 为了方便绑定数据,我们先创建一个BaseFragent的抽象类

    public abstract class BaseFragment extends Fragment {
        public abstract int getLayoutID();
    
        public abstract void initView();
    
        public View view;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            view = inflater.inflate(getLayoutID(), container, false);
            return view;
        }
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            initView();
        }
    }
  • 各自的fragment继承并绑定各自的布局,关联各自的数据,互不干扰 
    FragmentA

    public class FragmentA extends BaseFragment {
        private String title;
        private TextView txt;
    
        @Override
        public int getLayoutID() {
            return R.layout.fragment_layout_a;
        }
    
        @Override
        public void initView() {
            txt = (TextView) view.findViewById(R.id.msg);
            txt.setText("FragmentA:" + title);
        }
    
        public static FragmentA getInstance(String title) {
            FragmentA mf = new FragmentA();
            mf.title = title;
            return mf;
        }
    }

    FragmentB

    public class FragmentB extends BaseFragment {
        private String title;
        private TextView txt;
    
        @Override
        public int getLayoutID() {
            return R.layout.fragment_layout_b;
        }
    
        @Override
        public void initView() {
            txt = (TextView) view.findViewById(R.id.msg);
            txt.setText("FragmentB:" + title);
        }
    
        public static FragmentB getInstance(String title) {
            FragmentB mf = new FragmentB();
            mf.title = title;
            return mf;
        }
    }

    ……FragmentC、FragmentD、FragmentE、FragmentF。

  • 修改绑定viewpager的arraylist的对象类型

    private ArrayList<BaseFragment> mFagments = new ArrayList<>();

 

  • 添加数据

    //for (String s : mTitles) {
    //     mFagments.add(MyFragment.getInstance(s));
    //}
    mFagments.add(FragmentA.getInstance(mTitles[0]));
    mFagments.add(FragmentB.getInstance(mTitles[1]));
    mFagments.add(FragmentC.getInstance(mTitles[2]));
    mFagments.add(FragmentD.getInstance(mTitles[3]));
    mFagments.add(FragmentE.getInstance(mTitles[4]));
    mFagments.add(FragmentF.getInstance(mTitles[5]));

    以上即可实现绑定不同的Fragment,效果如下:

源码下载

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值