几种tab导航的方式

本文介绍三种使用Fragment的方式:1. 通过FragmentManager动态控制Fragment显示与隐藏;2. 结合ViewPager和FragmentPageAdapter实现滑动效果;3. 利用TabLayout、ViewPager与FragmentPageAdapter实现标签式导航。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、使用Fragment+Fragment Manager动态控制Fragment的出现和消失,没有滑动功能
就是底部几个按钮,通过按钮的点击来控制页面的变换
隐藏Fragment的代码,避免同时出现多个Fragment

private void hideFragment(FragmentTransaction transaction) {

        if (lifeFragment != null) {
            transaction.hide(lifeFragment);
        }
        if (techFragment != null) {
            transaction.hide(techFragment);
        }
        if (mineFragment != null) {
            transaction.hide(mineFragment);
        }
        if(collectionFragment!=null){
            transaction.hide(collectionFragment);
        }

显示Fragment的代码

 private void setTab(int n) {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        resetButton();
//        为了防止同时显示多个fragment,先把所有的fragment隐藏
        hideFragment(transaction);
        switch (n) {
            case 0:
                ib_life.setImageResource(R.mipmap.life_tabp);
//                如果fragment未建立,新建一个然后添加到FrameLayout
                if (lifeFragment == null) {
                    lifeFragment = new LifeFragment();
                    transaction.add(R.id.frameLayout, lifeFragment);
                } else {
//                    如果已经建立,直接显示
                    transaction.show(lifeFragment);
                }

                break;
            case 1:
                ib_tech.setImageResource(R.mipmap.tech_tabp);
                if (techFragment == null) {
                    techFragment = new TechFragment();
                    transaction.add(R.id.frameLayout, techFragment);
                } else {
                    transaction.show(techFragment);
                }
                break;
            case 2:
                ib_mine.setImageResource(R.mipmap.mine_tabp);
                if (mineFragment == null) {
                    mineFragment = new MineFragment();
                    transaction.add(R.id.frameLayout, mineFragment);
                } else {
                    transaction.show(mineFragment);
                }
                break;

        }
        transaction.commit();
    }

按钮的点击事件,关联Fragment的出现与否

 public void onClick(View view) {
        switch (view.getId()) {
            case R.id.imageButton_life:
                setTab(0);
                break;
            case R.id.imageButton_tech:
                setTab(1);
                break;
            case R.id.imageButton_mine:
                setTab(2);
                break;
        }

把显示Fragment的代码抽离出来后,可以在onCreate()方法中,初始化Fragment,显示第一个布局。
2、使用Fragment+ViewPager+FragmentPageAdapter实现(因为有ViewPager可以实现滑动的效果,当然也可以实现点击切换)
实现FragmentPageAdapter声明一个fragment的List,然后填充到ViewPager【adapter都是为了给组件填充数据的】

 mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public android.support.v4.app.Fragment getItem(int position) {
                return fragments.get(position);
            }

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

设置ViewPager的页面改动的监听事件,这里仅仅是改变下方按钮的颜色

 viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                resetButton();
                switch(position){
                    case 0:
                        imageButton_1.setImageResource(R.mipmap.tabp_1);
                        break;
                    case 1:
                        imageButton_2.setImageResource(R.mipmap.tabp_2);
                        break;
                    case 2:
                        imageButton_3.setImageResource(R.mipmap.tabp_3);
                        break;
                    case 3:
                        imageButton_4.setImageResource(R.mipmap.tabp_4);
                        break;
                }

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

设置按钮的点击切换ViewPager页面setCurrentItem(num);

public void onClick(View view) {
        resetButton();
        switch(view.getId()){
            case R.id.imageButton_1:


                viewPager.setCurrentItem(0);
                break;
            case R.id.imageButton_2:

                viewPager.setCurrentItem(1);
                break;
            case R.id.imageButton_3:

                viewPager.setCurrentItem(2);
                break;
            case R.id.imageButton_4:

                viewPager.setCurrentItem(3);
                break;
        }
    }

3、TabLayout+ViewPager+Fragment+FragmentPageAdapter

【1】设置adapter填充数据

 adapter = new FragmentPagerAdapter(getFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                return fragments.get(position);
            }

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

【2】tabLayout添加标签

 tabLayout.addTab(tabLayout.newTab().setText(R.string.android));
        tabLayout.addTab(tabLayout.newTab().setText(R.string.java));
        tabLayout.addTab(tabLayout.newTab().setText(R.string.others));

【3】在onCreateActicity()方法中设置tablayout标签选中的事件,只要让ViewPager显示特定页面就行了

public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }

使用这个方法,将tabLayout和viewPager联系起来,必须在adapter中重写getPageTitle()来返回标签的文字

tabLayout.setupWithViewPager(viewPager);
“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值