【发布时间】:2016-05-20 21:47:07
【问题描述】:
我想知道哪种方法是更改 Fragment、将它们添加到 backstack 并在屏幕旋转后恢复可见 Fragment 的正确方法。
目前,我使用这种方法来初始化第一个Fragment:
private void inflateInitialFragment() {
FragmentManager manager = getFragmentManager();
Fragment mainFragment = manager.findFragmentByTag(MainMenuFragment.class.getSimpleName());
FragmentTransaction ft = manager.beginTransaction();
if (mainFragment == null) {
ft.replace(R.id.mainContainer, new MainMenuFragment(), MainMenuFragment.class.getSimpleName());
} else if (!(mainFragment.isAdded() && !mainFragment.isDetached() && !mainFragment.isRemoving())) {
ft.replace(R.id.mainContainer, mainFragment, MainMenuFragment.class.getSimpleName());
}
ft.commit();
manager.executePendingTransactions();
}
然后为了显示新的片段,我有这样的方法:
public void openAwards() {
getFragmentManager().beginTransaction().replace(R.id.mainContainer,
new AwardsFragment(), AwardsFragment.class.getSimpleName()).addToBackStack(null).commit();
}
然后返回主屏幕:
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
} else {
getFragmentManager().popBackStack();
}
}
经过几次屏幕旋转后,我遇到了像这样的崩溃:
java.lang.IllegalStateException: Fragment already added: MainMenuFragment{42c64d90 #0 id=0x7f0b003f MainMenuFragment}
我应该如何更改可见的片段并在屏幕旋转后恢复它们?
我不认为每次保存一些字符串或片段是恢复它们的好方法。
【问题讨论】: