Activity被系统销毁造成的Fragment混乱的问题

转自 CSDN  huidawoxiaozi

大多数App主页底部都会有几个tab页面,用Activity+Fragment或者Activity+Vierpager+Fragment来管理Tab页面(由于viewpager的加载机制所以不会出现这个问题),当程序长期在后台由于系统资源不足就把MainActivity回收了或者从MainActivity点进去的activity报错了点击back回到MainActivity fragment也会混乱,主要是由于fragment的状态还保存着,但是add()和hide() show()方法已经失效了,分析好原因,我们就可以解决了。

在MainActivity被销毁或者在后台等情况下会调用onSaveInstanceState方法来保存状态,所以做个标记outState.putBoolean("isMainActivityDestroy",true);应为被销毁会重新调用onCreate方法,所以你if(savedInstanceState!=null&&savedInstanceState.getBoolean("isMainActivityDestroy",false))满足这个条件就去移除之前fragment状态,重新add fragment。看代码你会更了解;

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fragmentManager = getSupportFragmentManager();
        if(savedInstanceState!=null&&savedInstanceState.getBoolean("isMainActivityDestroy",false)){
            //当activity被系统销毁,获取到之前的fragment,并且移除之前的fragment的状态
indexFragment = (IndexFragment) fragmentManager.findFragmentByTag("flag1");
            buyGoldFragment = (BuyGoldFragment) fragmentManager.findFragmentByTag("flag2");
            discoveryFragment = (DiscoveryFragment) fragmentManager.findFragmentByTag("flag3");
            mineFragment = (MineFragment) fragmentManager.findFragmentByTag("flag4");
            fragmentManager.beginTransaction().remove(indexFragment).commit();
            fragmentManager.beginTransaction().remove(buyGoldFragment).commit();
            fragmentManager.beginTransaction().remove(discoveryFragment).commit();
            fragmentManager.beginTransaction().remove(mineFragment).commit();
        }
setContentView(R.layout.activity_main);
       
        //创建fragment,并且全部add一遍
indexFragment = new IndexFragment();
        buyGoldFragment = new BuyGoldFragment();
        discoveryFragment = new DiscoveryFragment();
        mineFragment = new MineFragment();
        fragmentManager.beginTransaction().add(R.id.linear_fragment, indexFragment,"flag1").commit();
        fragmentManager.beginTransaction().add(R.id.linear_fragment, buyGoldFragment,"flag2").hide(buyGoldFragment).
                add(R.id.linear_fragment, discoveryFragment,"flag3").hide(discoveryFragment).
                add(R.id.linear_fragment, mineFragment,"flag4").hide(mineFragment).commit();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
       super.onSaveInstanceState(outState);
       outState.putBoolean("isMainActivityDestroy",true);
    }

这样就会重新创建Fragment的状态,add() show() hide() 也就重新起作用了

 

本质的原因是因为在Activivty在销毁时并没有导致Fragment的变化,Fragment的生命周期和Activity的生命周期并未同步,所以会出现问题,至于解决方案可以根据具体需求来做。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值