欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android TabLayout的使用(ViewPager添加标题)

程序员文章站 2022-06-06 09:48:49
...

效果图

Android TabLayout的使用(ViewPager添加标题)
上方的指示器用到的就是TabLayout
下方是一个ViewPager
ViewPager内的数据为fragment

东西就这么多,先看下布局:

先看下如何引用TabLayout

Android TabLayout的使用(ViewPager添加标题)
布局的选择控件界面选择Design>TabLayout,需要添加这个依赖,之后就是布局的内容

<?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:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.tablayoutdemo.MainActivity">

    <android.support.design.widget.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="50dp">

    </android.support.design.widget.TabLayout>
    <android.support.v4.view.ViewPager
        android:id="@+id/vp"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

    </android.support.v4.view.ViewPager>
</LinearLayout>

布局代码就两个控件,TabLayout 、ViewPager。
需要用到Fragment,接下来写我们的fragment

fragment代码

public class PagerFramgent extends android.support.v4.app.Fragment {
    private int a;

    /**
     * 创建一个静态实例化Fragment的方法
     * @param a 外界传入的值
     * @return
     */
    public static PagerFramgent newInstance(int a){
        PagerFramgent pf=new PagerFramgent();
       Bundle bundle= new Bundle();
        bundle.putInt("a",a);
        //向fragment中传值,使用此方法,不用使用有参构造方法
        pf.setArguments(bundle);
        return pf;
    }

    String tag=null;
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //取出保存的值
        this.a=getArguments().getInt("a");
        //获取类名
        tag=this.getClass().getSimpleName();
        //log生命周期
        Log.e(tag,"onCreate");
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
       //加载一个布局,布局中只有一个textview
        View view=inflater.inflate(R.layout.fragment,container,false);
        TextView textView= (TextView) view.findViewById(R.id.textView);
        //设置文本,将传进来的值设置进去
        textView.setText(a+"");
        Log.e(tag,"onCreateView");
        return view;
    }

上面的就是普通的fragment的创建过程。其中fragment传值为什么不能通过有参构造方法请看博客:为什么要用Fragment.setArguments(Bundle bundle)来传递参数
其它就挺简单的了,好了接下来就是ViewPager要用到的适配器了

适配器

public class MyAdapter extends FragmentPagerAdapter{
        List<PagerFramgent> list;
        public MyAdapter(FragmentManager fm) {
            super(fm);
            //创建集合用来保存fragment对象
            list=new ArrayList<>();
        }
        public void add(PagerFramgent framgent){
            list.add(framgent);

        }
        //当前页数据
        @Override
        public Fragment getItem(int position) {
            return list.get(position);
        }
        //获取pager数量
        @Override
        public int getCount() {
            return list.size();
        }
        //重写父类的destroyItem方法,什么都不要写,避免viewpager销毁fragment
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {

        }
        //添加标题
        @Override
        public CharSequence getPageTitle(int position) {
        //返回的标题是之前传的值
            return list.get(position).getArguments().getInt("a")+"";
        }
    }

这边就是一个自定义FragmentPagerAdapter的列子了,其中为了避免ViewPager将fragment对象给销毁,重写了一个空的destroyItem方法
ViewPager和fragment结合使用不想fragment被不断销毁可以查看:ViewPager防止Fragment销毁以及取消Fragment的预加载

主界面代码

public class MainActivity extends AppCompatActivity {

    private ViewPager vp;
    private TabLayout tabLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        vp = (ViewPager) findViewById(R.id.vp);
        tabLayout= (TabLayout) findViewById(R.id.tab);
        //实例化适配器
        MyAdapter adapter=new MyAdapter(getSupportFragmentManager());
       for (int i=0;i<20;i++){//循环添加数据
           adapter.add(PagerFramgent.newInstance(i));
       }
       //viewpager设置适配器
        vp.setAdapter(adapter);
        //设置预加载的数量当然这个值越小越好
        vp.setOffscreenPageLimit(2);
        //给TabLayout设置ViewPager
        tabLayout.setupWithViewPager(vp);
        //设置Mode样式
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);

其中TabLayout.MODE_SCROLLABLE适配Tab较多的时候,
TabLayout.MODE_FIXED适合较少的tab(会在一个屏幕中显示所有的tab)
这个时候你就可以运行下看到效果了。当然这里都是默认的样式。
Android TabLayout的使用(ViewPager添加标题)

改变Tab显示的样式

//通过下标得到对应位置的Tab对象
        TabLayout.Tab tab = tabLayout.getTabAt(0);
        //给tab设置图标(当然还有文本、颜色等)
        tab.setIcon(R.mipmap.ic_launcher);
        //设置指示器的颜色
       tabLayout.setSelectedTabIndicatorColor(Color.BLUE);
        //再获得一个Tab对象
        TabLayout.Tab tab1 = tabLayout.getTabAt(1);
        //设置显示的View
        tab1.setCustomView( R.layout.tabview);

这里呢就是需要通过TabLayout的内部类Tab来进行设置,(除了设置指示器颜色)
Android TabLayout的使用(ViewPager添加标题)

ok,大功告成,其中fragment的生命周期大家可以观察一下,设置与不设置之前的区别,来观察fragment销毁新建。

最后的最后,个人淘宝店(抱歉,请见谅)。。霓裳雅阁