解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题

解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题

最近在做一个android 项目,需要实现在同一个Activity之间切换的功能(类似于微信)。然而,在实现后,发现会出现Fragment重叠的问题。参考网上的解决方法,解决了此问题,分享给大家。

当该Activity由于长时间占用内存或者由于内存不足时,而被系统收回内存,就容易出现Fragment重叠的问题。

解决方法

出现上述问题的原因是,当由于某些原因,系统销毁掉该Activity后,重新启动该Activity而出现重叠问题。那么,我们可以利用onSaveInstanceState()函数的特性,当Activity被系统销毁掉时,保存当前Activity中显示Fragment的TAG值。若启动时,再show被保存TAG的Fragment。

注意:onSaveInstanceState()函数并不是生命周期方法,只有在应用遇到意外情况(如内存不足等),而被系统销毁时,才会调用该方法。而当用户按back键退出时,不会调用该方法。

现在,解决这个问题的主要思路有了,我们看看具体如何实现。
1. 为每个Fragment设置TAG值。

    private void setSelect(int i) {
        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction transaction = fm.beginTransaction();
        hideFragment(transaction);
        // setTab(i);
        // mViewPager.setCurrentItem(i);
        // 把图片设置为亮的
        // 设置内容区域
        switch (i) {
        case 0:
            if (mTab01 == null) {
                mTab01 = new HomeFragment();
                //设置tag值
                **transaction.add(R.id.id_content, mTab01,TAG_FRAGMENT[0]);**
            } else {
                transaction.show(mTab01);
            }
            setTitle("旅行管家");
            setHome();
            mImgHome.setImageResource(R.drawable.icon_dilan_shouye);
            break;
        case 1:
            if (mTab02 == null) {
                mTab02 = new PersonalFragment();
                transaction.add(R.id.id_content, mTab02, TAG_FRAGMENT[1]);
            } else {
                transaction.show(mTab02);

            }
            setTitle("我的");
            setPersonal();
            mImgPersonal.setImageResource(R.drawable.icon_dilan_wode);
            break;
        case 2:
            if (mTab03 == null) {
                mTab03 = new FriendFragment();
                transaction.add(R.id.id_content, mTab03,TAG_FRAGMENT[2]);
            } else {
                transaction.show(mTab03);
            }
            setTitle("通讯录");
            mImgFriend.setImageResource(R.drawable.icon_dilan_tongxulu);
            break;
        case 3:
            if (mTab04 == null) {
                mTab04 = new FindFragment();
                transaction.add(R.id.id_content, mTab04,TAG_FRAGMENT[3]);
            } else {
                transaction.show(mTab04);
            }
            setTitle("发现");
            mImgFind.setImageResource(R.drawable.icon_dilan_faxian);
            break;
        case 4:
            if (mTab05 == null) {
                mTab05 = new ShopFragment();
                transaction.add(R.id.id_content, mTab05,TAG_FRAGMENT[4]);
            } else {
                transaction.show(mTab05);
            }
            setTitle("优选");
            mImgShop.setImageResource(R.drawable.icon_dilan_youxuan);
            break;

        default:
            break;
        }

        transaction.commit();
    }

  1. 重写onSaveInstanceState()函数,保存Fragment的tag值。
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putInt(SAVED_INDEX, index);
        super.onSaveInstanceState(outState);

    }


  1. 在初始化布局后,判断onCreate(Bundle savedInstanceState)方法中的savedInstanceState是否为null,若不为null,则获取意外销毁后由onSaveInstanceState()保存的tag值,根据tag值,找到Fragment。

注意:由onSaveInstanceState()保存的数据(在Activity被意外销毁之前),可以由onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        initViews();
        fragmentManager = getSupportFragmentManager();
        if(savedInstanceState != null){
            index = savedInstanceState.getInt(SAVED_INDEX,index);
            mTab01 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[0]);
            mTab02 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[1]);
            mTab03 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[2]);
            mTab04 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[3]);
            mTab05 = fragmentManager.findFragmentByTag(TAG_FRAGMENT[4]);
        }
        setSelect(index);

    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值