Fragment解决重复加载的问题

//当前显示的fragment
private static final String CURRENT_FRAGMENT = "STATE_FRAGMENT_SHOW";

private TextView tvone;
private TextView tvtwo;
private TextView tvthree;
private FragmentManager fragmentManager;

private Fragment currentFragment = new Fragment();
private List<Fragment> fragments = new ArrayList<>();

private int currentIndex = 0;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    this.tvthree = (TextView) findViewById(R.id.tv_three);
    this.tvtwo = (TextView) findViewById(R.id.tv_two);
    this.tvone = (TextView) findViewById(R.id.tv_one);

    fragmentManager = getSupportFragmentManager();

    tvthree.setOnClickListener(this);
    tvtwo.setOnClickListener(this);
    tvone.setOnClickListener(this);


    if (savedInstanceState != null) { // “内存重启”时调用

        //获取“内存重启”时保存的索引下标
        currentIndex = savedInstanceState.getInt(CURRENT_FRAGMENT,0);

        //注意,添加顺序要跟下面添加的顺序一样!!!!
        fragments.removeAll(fragments);
        fragments.add(fragmentManager.findFragmentByTag(0+""));
        fragments.add(fragmentManager.findFragmentByTag(1+""));
        fragments.add(fragmentManager.findFragmentByTag(2+""));

        //恢复fragment页面
        restoreFragment();


    }else{      //正常启动时调用

        fragments.add(new OneFragment());
        fragments.add(new TwoFragment());
        fragments.add(new ThreeFragment());

        showFragment();
    }

}

@Override
protected void onSaveInstanceState(Bundle outState) {

    //“内存重启”时保存当前的fragment名字
    outState.putInt(CURRENT_FRAGMENT,currentIndex);
    super.onSaveInstanceState(outState);
}

@Override
public void onClick(View v) {

    switch (v.getId()){

        case R.id.tv_one:

            currentIndex = 0;

            break;
        case R.id.tv_two:

            currentIndex = 1;

            break;
        case R.id.tv_three:

            currentIndex = 2;

            break;

    }

    showFragment();

}


/**
 * 使用show() hide()切换页面
 * 显示fragment
 */
private void showFragment(){

    FragmentTransaction transaction = fragmentManager.beginTransaction();

    //如果之前没有添加过
    if(!fragments.get(currentIndex).isAdded()){
        transaction
                .hide(currentFragment)
                .add(R.id.content,fragments.get(currentIndex),""+currentIndex);  //第三个参数为添加当前的fragment时绑定一个tag

    }else{
        transaction
                .hide(currentFragment)
                .show(fragments.get(currentIndex));
    }

    currentFragment = fragments.get(currentIndex);

    transaction.commit();

}

/**
 * 恢复fragment
 */
private void restoreFragment(){


    FragmentTransaction mBeginTreansaction = fragmentManager.beginTransaction();

    for (int i = 0; i < fragments.size(); i++) {

        if(i == currentIndex){
            mBeginTreansaction.show(fragments.get(i));
        }else{
            mBeginTreansaction.hide(fragments.get(i));
        }

    }

    mBeginTreansaction.commit();

    //把当前显示的fragment记录下来
    currentFragment = fragments.get(currentIndex);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值