Activity recreate时导致Fragment被添加多次,显示混乱问题

在某些场景下,旋转屏幕、内存不足,或app内切换语言主动调用reCreate()方法,造成Activity被destroy ,系统会recreate 重新创建该Activity ,会重走onCreate()方法, 如果Activity的onCreate中存在add Fragment操作,则会再次add一次该Fragment,造成该Activity中FragmentManager添加了多个相同的Fragment,造成也面显示覆盖的问题。

解决方案:

private int currentIndex = 0;
private Fragment currentFragment = new Fragment();
private Fragment fagment1 = new MyFragment1();
private Fragment fagment2 = new MyFragment2();

在onCreate()方法中判断savedInstanceState状态,reCreate()后savedInstanceState不为空,
通过getSupportFragmentManager().findFragmentByTag(),获取之前add过的fragment,
避免造成重复add fragment,savedInstanceState == null时调用的是原来onCreate()中的方法。


if (savedInstanceState != null) {
    fagment1 = getSupportFragmentManager().findFragmentByTag("tag1");
    fagment2 = getSupportFragmentManager().findFragmentByTag("tag2");
    //记录当前显示的时哪个fragment
    int tabId = savedInstanceState.getInt("currentIndex");
    if (tabId == 0) {
        switchFragment(fagment1).commit();
    } else {
        switchFragment(fagment2).commit();
    }
} else {
    switchFragment(investmentFragment).commit();
}



private FragmentTransaction switchFragment(Fragment targetFragment) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    if (!targetFragment.isAdded()) {
        if (currentFragment != null) {
            transaction.hide(currentFragment);
        }
        String tag = targetFragment.getClass().getName();
        transaction.add(R.id.fragment, targetFragment, tag);
    } else {
        transaction.hide(currentFragment).show(targetFragment);
    }
    currentFragment = targetFragment;
    return transaction;
}


public void onTabClick(View view) {
     switch (view.getId()) {
          case R.id.tab1:
               currentIndex = 0;
               switchFragment(fagment1).commit();
               break;
          case R.id.tab2:
               currentIndex = 1;
               switchFragment(fagment2).commit();
               break;
          default:
               break;
            
     }

 }


@Override
public void onSaveInstanceState(Bundle outState) {
   super.onSaveInstanceState(outState);
   outState.putInt("currentIndex", currentIndex);
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值