美文网首页
Android -- Fragment切换数据丢失

Android -- Fragment切换数据丢失

作者: 墨白1629 | 来源:发表于2017-07-20 12:14 被阅读500次

    加入简书时间不长,才几个月,从事Android开发的时间也不长,最近在Android开发的项目中遇到了些问题,有些心得,出来分享下。

    在项目中用到了RadioGroup,点击RadioButton切换Fragment,但是在切换Fragment的时候,前一个Fragment的数据没有了,再切换回去的时候一片空白,再网上找了些资料和博客,看了下他们的代码感觉逻辑不太清晰,也可能是我理解不够透彻,后来自己试验总结出自己的解决方法,主要的思想就是:切换Fragment的时候不销毁前一个Fragment,再切换回去的时候也不需要重新创建:

    代码如下:

    private int mCheckId;
    private RadioGroup.OnCheckedChangeListener mOnCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
    mCheckId = checkedId;
    addFragment(mCheckId);
    //前一个fragment
    mFragmentText = createFragment(mCheckId);
    }
    };

    private void addFragment(int checkId) {
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();
    //如果前一个fragment实例不为空
    if (mFragmentText != null){
    //且现有fragment实例被添加过
    if (createFragment(checkId).isAdded()){
    //隐藏前一个实例show出现有的之前的被隐藏的实例
    transaction
    .hide(mFragmentText)
    .show(createFragment(checkId))
    .commit();
    }else {
    //隐藏前一个实例,添加现有的实例
    transaction
    .hide(mFragmentText)
    .add(R.id.fragment_home, createFragment(checkId))
    .commit();
    }
    }else {
    transaction
    .add(R.id.fragment_home, createFragment(checkId))
    .commit();
    }
    }

    //切换
    Fragment fragment = null;
    private Fragment createFragment(int checkId) {
    switch (checkId) {
    case R.id.feerb1:
    fragment = mFragments.get(0);
    break;
    case R.id.feerb2:
    fragment = mFragments.get(1);
    break;
    case R.id.feerb3:
    fragment = mFragments.get(2);
    break;
    case R.id.feerb4:
    fragment = mFragments.get(3);
    break;
    default:
    fragment = mFragments.get(0);
    }
    return fragment;

    }

    mHomeFragment = new HomeFragment();

    mSportFragment = new SportFragment();

    mRecordFragment = new RecordFragment();

    mMineFragment = new MineFragment();

    mFragments = new SparseArray<>();

    mFragments.put(0, mHomeFragment);

    mFragments.put(1, mSportFragment);

    mFragments.put(2, mRecordFragment);

    mFragments.put(3, mMineFragment);


    我们不用replace()去切换,因为那样会销毁前一个Fragment,而是用add()添加,用hide()隐藏前一个Fragment。非常简单的一个逻辑就能实现,就是切换时前一个Fragment不销毁,而是隐藏,切换下一个前判断是否是已经添加过的,如果是就不重新创建,而是把隐藏的Fragment -->show()出来。

    第一次写,大家觉得不好也不要喷,给我点鼓励,我一直在努力。谢谢!

    相关文章

      网友评论

          本文标题:Android -- Fragment切换数据丢失

          本文链接:https://www.haomeiwen.com/subject/zipdkxtx.html