Fragment动态切换

前言

开发一个常规的app时,常规的界面设计:底部的导航栏,导航栏内添加不同页面的切换按钮.
虽然页面很简单,对于新手还是有些难度的,对fragment的生命周期和fragment的切换都需要一定的理解.
本篇文章是本人自己第一个项目的一些经验.

组件选择

我选择的组件是Radiogroup+fragment.我使用了一个SparseArray的数组来存放fragment. 这样就可以避免写switch语句.

        mFragmentSparesArry=new SparseArray<>();
        mFragmentSparesArry.append(R.id.index_tab,IndexFragment.newInstance("体检"));
        mFragmentSparesArry.append(R.id.record_tab,settingFragment.newInstance("记录"));
        mFragmentSparesArry.append(R.id.contact_tab,contactFragment.newInstance("导航"));
        mFragmentSparesArry.append(R.id.settings_tab,healthFragment.newInstance("设置"));

为什么是这么写,我也不清楚,但是newInstance()这个创建实例的方法是fragment自带的方法.我就直接调用这个方法,然后以键值对的形式存在数组中.

动态切换

首先来fragment的切换,选择的是动态的切换,一开始是使用的fragment的replace切换,发现每次切换都会生成一个新的实例,不满足项目的要求.所以去寻找了一些现有的切换方案.在打捞的推荐下,我选择了动态切换.

代码如下:

private FragmentTransaction switchFragment(Fragment targetFragment)
    {
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if(!targetFragment.isAdded())
        {
            //第一次使用switchFragment()时currentFragement为null,
            Log.e("Peter","!targetFragment.isAdded()");
            if(currentFragment!=null)
            {
                transaction.hide(currentFragment);
            }
           transaction.add(R.id.fragment_container,targetFragment,currentFragment.getClass().getName());
        }
        else
        {
            Log.e("Peter","else");
            transaction.hide(currentFragment)
                    .show(targetFragment);
        }
        currentFragment=targetFragment;
        return transaction;
    }

简单的说一下逻辑,主要涉及到fragment的两个操作,hide和add操作.
当监视器监测到点击事件后,判断目标页面是否添加过,如果没有,继续执行判断操作,判断当前页面是否为空,不为空,隐藏当前界面.隐藏当前界面之后,需要添加目标界面到容器中.如果目标页面被添加过了,隐藏当前界面,展示目标界面.最后一步尤为关键,以上操作过后,目标界面成为了当前界面.
是有点绕的一番说辞,所以画了一个流程图,便于理解
在这里插入图片描述

自定义导航栏默认显示界面

这里需要注意,不是调用系统的SupportFragmentMannager的方法,而是直接使用上面写的动态切换方法

switchFragment(mFragmentSparesArry.get(R.id.index_tab)).commit();

最后页面展示

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YuannaY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值