关于Fragment的加载和切换问题

在我们项目的开发中,少不了使用到Fragment,我们控制Fragment的切换有两种,第一种是replace,另一种hide和show,这两种有什么区别呢?

ps:在开发过程中,我发现有些代码里,在replace的时候,一直在new我们的Fragment,这样是不好的,我们应该在第一次创建的时候,将这些初始化好的Fragment放在我们创建的Fragmentlist中:

private List<Fragment> fragmentList = new ArrayList<>();
//创建Fragment并放入集合
HomeFragment homeFragment = new HomeFragment();
ClientFragment clientFragment = new ClientFragment();
TeamFragment teamFragment = new TeamFragment();
ComFragment comFragment = new ComFragment();
ShowMessageFragment showMessageFragment = new ShowMessageFragment();

fragmentList.add(homeFragment);
fragmentList.add(clientFragment);
fragmentList.add(teamFragment);
fragmentList.add(comFragment);
fragmentList.add(showMessageFragment);

首先我们看一下Fragmnet的replace的写法:

ps:fl 为占位布局的id,方法中需要传递Fragment的对象进去。

//Fragment替换方法
public void replace(Fragment fragment) {
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.fl, fragment);
    transaction.commit();
}
这种写法,会重新加载Fragment,那么这个时候,他里面的生命周期和方法就会再次运行,而我们往往不希望这样的事情发生,那么我们就需要使用到下面的方法:

private Fragment current_fragment;

//fragment的方法
private void startFragmentAdd(Fragment fragment) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();
    if (current_fragment == null) {
        fragmentTransaction.add(R.id.fl, fragment).commit();
        current_fragment = fragment;
    }
    if (current_fragment != fragment) {
        // 先判断是否被add过
        if (!fragment.isAdded()) {
            // 隐藏当前的fragment,add下一个到Activity中
            fragmentTransaction.hide(current_fragment).add(R.id.fl, fragment).commit();
        } else {
            // 隐藏当前的fragment,显示下一个
            fragmentTransaction.hide(current_fragment).show(fragment).commit();
        }
        current_fragment = fragment;
    }
}

我们仔细品味一下这个方法,他依靠Fragment的hide和show,实现了Fragment的切换,这种方式,我们的Fragment不会被重新加载。

注:在使用Hide和Show方法时,我们会遇到Fragment点击穿透的情况,这个时候,我们需要在我们的Fragment的布局的根下加入:clickable="true"

我本人还是推荐不用replace而是使用第二种方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值