多个Fragment之间的切换,该用什么方法呢?

最近在开发过程中使用Fragment做很常见的类微信界面,底部四个可选项,首页、课程、发现和我的,每点击其中一个,在上方显示不同的Fragment,如下图:

起初我并没有考虑太多,用了最简单的方式,直接使用replace方法,代码如下:

getSupportFragmentManager().beginTransaction().replace(R.id.rl_main_content, fragment)
        .commit();

后来别人看我代码的时候,说我这样用会重复创建Fragment界面,浪费资源,如果涉及网络请求,还会重复请求,消耗用户流量,用户体验会很差。

于是,我写了个例子打log看看在使用replace的时候,Fragment究竟走了哪些生命周期,log如下:

从log中我们可以看出,用replace的方式切换Fragment时,会把Fragment的完整生命周期走一遍,这就让人不能忍了,我的需求是会多次在Fragment之间切换的,如果每次都重走Fragment生命周期,的确是会浪费资源,消耗流量的。

接着我又找到另一种方式,add()-->detach()-->attach():

 

getSupportFragmentManager().beginTransaction().detach(fragment);
getSupportFragmentManager().beginTransaction().attach(fragment);

 

这种方式是先调用add()方法并给Fragment传入唯一的Tag,将Fragment加入它的管理类中,接着我们调用detach()方法,解除当前Fragment与Activity的关联,然后用管理类的findFragmentByTag()方法通过Tag来找到我们要的Fragment,最后调用attach()方法将其与Activity关联,代码如下:

private Fragment currentFragment;
private void replaceFragment(String tag) {
    if (currentFragment != null) {
        getSupportFragmentManager().beginTransaction().detach(currentFragment).commit();
    }
    currentFragment = getSupportFragmentManager().findFragmentByTag(tag);
    if (currentFragment == null) {
        switch (tag) {
            case "home":
                currentFragment = new HomeFragment();
                break;
            case "lesson":
                currentFragment = new LessonFragment();
                break;
            case "discover":
                currentFragment = new DiscoverFragment();
                break;
            case "mine":
                currentFragment = new MineFragment();
                break;
        }
        getSupportFragmentManager().beginTransaction().add(R.id.rl_main_content, currentFragment, tag).commit();
    }else {
        getSupportFragmentManager().beginTransaction().attach(currentFragment).commit();
    }
}

log如下:

我们从log中可以看出,再次切换至HomeFragment时没有调用onAttach和onCreate方法,说明这种方式减少了生命周期的调用,也算是提升了一些性能。

不过我们还有一种方式,可以完全不重新调用任何一个生命周期函数,add()-->hide()-->show()-->:(代码基本和上面一样,只是把attach改为show,dettach改为hide)

private void replaceFragment(String tag) {
    if (currentFragment != null) {
        getSupportFragmentManager().beginTransaction().hide(currentFragment).commit();
    }
    currentFragment = getSupportFragmentManager().findFragmentByTag(tag);
    if (currentFragment == null) {
        switch (tag) {
            case "home":
                currentFragment = new HomeFragment();
                break;
            case "lesson":
                currentFragment = new LessonFragment();
                break;
            case "discover":
                currentFragment = new DiscoverFragment();
                break;
            case "mine":
                currentFragment = new MineFragment();
                break;
        }
        getSupportFragmentManager().beginTransaction().add(R.id.rl_main_content, currentFragment, tag).commit();
    }else {
        getSupportFragmentManager().beginTransaction().show(currentFragment).commit();
    }
}
  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值