我在我的容器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();
}
我从我的容器 Activity 中调用它;第一次:
- 进入 else 语句,mBFrag 替换了 mAFrag。
然后我按下返回按钮:
- 操作被反转(显示 mAFrag 但是... mBFrag 被移除了吗?)。
然后我再次通过从同一个 Activity 调用 showBFrag() 前进:
- 它再次进入 else 语句。(因此我可以推断出 mBFrag 没有被添加)
- 但是我得到了 Fragment already added IllegalStateException…(那么为什么它没有进入 if 语句呢?)
所以:
- 如果我收到了 Fragment already added 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);"