【问题标题】:Properly replacing Fragments正确替换片段
【发布时间】: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}

我应该如何更改可见的片段并在屏幕旋转后恢复它们?
我不认为每次保存一些字符串或片段是恢复它们的好方法。

【问题讨论】:

标签: android android-fragments


【解决方案1】:

如果您的 Activity 扩展了 android.app.Activity,则无需重写 onBackPressed()。它会自动从后台弹出你的片段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多