我在容器 Activity 上使用此方法来显示 BFrag
public void showBFrag()
{
// Start a new FragmentTransaction
FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction();
if(mBFrag.isAdded())
{
Log.d(LOG_TAG, "Show() BFrag");
fragmentTransaction.show(mBFrag);
}
else
{
Log.d(LOG_TAG, "Replacing AFrag -> BFrag");
fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag);
}
// Keep the transaction in the back stack so it will be reversed when backbutton is pressed
fragmentTransaction.addToBackStack(null);
// Commit transaction
fragmentTransaction.commit();
}
我从我的容器活动中调用它;首次:
- 进入 else 语句并 mBFrag 替换 mAFrag。
然后我按下后退按钮:
- 并且操作相反(显示了 mAFrag 但.. mBFrag 是否被删除?)。
然后我通过从同一个 Activity 调用 showBFrag() 再次前进:
- 它再次进入 else 语句。(所以我可以推断未添加 mBFrag)
- 但是我得到了一个Fragment 已经添加了 IllegalStateException ...(那么为什么它没有进入 if 语句呢?)
所以:
- 如果我得到一个Fragment 已经添加 IllegalStateException ,为什么 isAdded() 方法不返回 TRUE ?
- popBackStack 操作是否完全删除以前添加的片段?
- 我误解了什么行为?
编辑:这是异常的完整信息。
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): java.lang.IllegalStateException: Fragment already added: BFrag{40b28158 id=0x7f0c0085}
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at android.app.BackStackRecord.doAddOp(BackStackRecord.java:322)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at android.app.BackStackRecord.replace(BackStackRecord.java:360)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at android.app.BackStackRecord.replace(BackStackRecord.java:352)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at myPackageName.containerActivity.showBFrag() // This line: "fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag);"