Fragment优化

App应用中遇到Fragment经常会这样写

public void click1(View v){
    	//把fragment1的界面显示到帧布局中
    	//创建fragment对象
    	Fragment1 fg1 = new Fragment1();
    	//获取fragment管理器
    	FragmentManager fm = getFragmentManager();
    	//打开事务
    	FragmentTransaction ft = fm.beginTransaction();
    	//把内容显示到帧布局
    	ft.replace(R.id.fl, fg1);
    	//提交
    	ft.commit();
    }
    
    public void click2(View v){
    	//把fragment1的界面显示到帧布局中
    	//创建fragment对象
    	Fragment2 fg2 = new Fragment2();
    	//获取fragment管理器
    	FragmentManager fm = getFragmentManager();
    	//打开事务
    	FragmentTransaction ft = fm.beginTransaction();
    	//把内容显示到帧布局
    	ft.replace(R.id.fl, fg2);
    	//提交
    	ft.commit();
    }
    
    public void click3(View v){
    	//把fragment1的界面显示到帧布局中
    	//创建fragment对象
    	Fragment3 fg3 = new Fragment3();
    	//获取fragment管理器
    	FragmentManager fm = getFragmentManager();
    	//打开事务
    	FragmentTransaction ft = fm.beginTransaction();
    	//把内容显示到帧布局
    	ft.replace(R.id.fl, fg3);
    	//提交
    	ft.commit();
    }

基础更好一点的同学会用show和hide方法

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.hide(new FirstFragment())
        .show(new SecondFragment())
        .commit();

诚然这两种都可以切换Fragment,但是面对用户大量点击来回切换,或者你的Fragment本来就很多,每次都这样操作,那么很快你的应用就会OOM,就算不崩那也会异常的卡顿.

优化方案

方案一:

预加载模式

//首先需要先实例好三个全局Fragment

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.fragment, FirstFragment.getInstance());
ft.add(R.id.fragment, SecondFragment.getInstance());
ft.add(R.id.fragment, ThirdFragment.getInstance());
ft.hide(SecondFragment.getInstance());
ft.hide(ThirdFragment.getInstance());
ft.commit();

在加载第一个Fragment时就把全部Fragment加载好,下次使用直接调用如:

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.hide(FirstFragment.getInstance())
        .show(SecondFragment.getInstance())
        .commit();

是不是总觉怪怪的,虽然比之前的代码好,当然还有更好的方法,就是动态加载,

方案二:

动态加载

下面的代码就是动态加载切换不同的Fragment

//(全局)
    private Fragment currentFragment = fg1;
    private  FragmentTransaction switchFragment(Fragment targetFragment) {
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        if (!targetFragment.isAdded()) {
            //第一次使用switchFragment()时currentFragment为null,所以要判断一下
            if (currentFragment != null) {
                transaction.hide(currentFragment);
            }
            transaction.add(R.id.fl, targetFragment,targetFragment.getClass().getName());

        } else {
            transaction.hide(currentFragment).show(targetFragment);
        }
        currentFragment = targetFragment;
        return  transaction;
    }

需要使用的时候,点击Fragment条目的时候动态切换了

rb_fengyun.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchFragment(fg1).commit();
            }
        });

        rb_youxi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchFragment(fg2).commit();
            }
        });

        rb_biaosheng.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchFragment(fg3).commit();
            }
        });

        rb_xinpin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switchFragment(fg4).commit();
            }
        });

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值