其实没必要通过onSaveInstanceState(Bundle outState)获取之前的fragment,因为FragmentManager()本身就会帮我们保存fragment,因此重启时通过getSupportFragmentManager().getFragments()获取所有fragment即可,这样,解决fragment重启就变得很简单了
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private FirstFragment firstFragment;
private FourthFragment fourthFragment;
private SecondFragment secondFragment;
private ThirdFragment thirdFragment;
private List<Fragment> fragments = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragments = getSupportFragmentManager().getFragments();
//判断FragmentManager里是否有添加fragment,没有的话重新添加,有的话说明是内存不足重启,则不需要重新添加fragment
if(fragments.size()<=0)
addFragment();
findViewById(R.id.first).setOnClickListener(this);
findViewById(R.id.second).setOnClickListener(this);
findViewById(R.id.third).setOnClickListener(this);
findViewById(R.id.fourth).setOnClickListener(this);
}
/**
* 添加fragment
*/
private void addFragment() {
firstFragment = FirstFragment.newInstance();
secondFragment = SecondFragment.newInstance();
thirdFragment = ThirdFragment.newInstance();
fourthFragment = FourthFragment.newInstance();
fragments = new ArrayList<>();
fragments.clear();
fragments.add(firstFragment);
fragments.add(secondFragment);
fragments.add(thirdFragment);
fragments.add(fourthFragment);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
for (Fragment f : fragments)
transaction.add(R.id.frameLayout, f);
transaction.commit();
//显示第一个fragment
showFragment(0);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.first:
showFragment(0);
break;
case R.id.second:
showFragment(1);
break;
case R.id.third:
showFragment(2);
break;
case R.id.fourth:
showFragment(3);
break;
}
}
/**
* 显示fragment
* @param index
*/
private void showFragment(int index) {
if (fragments != null && fragments.size() > index) {
int size = fragments.size();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
for (int i = 0; i < size; i++) {
if (i == index) {
transaction.show(fragments.get(index));
} else
transaction.hide(fragments.get(i));
}
transaction.commit();
}
}
}