我在容器活动中使用此方法来显示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();
}我第一次从集装箱活动中称它为:
然后我按后退按钮:
然后,再次从相同的活动调用showBFrag():
所以:
编辑:这是异常的完整信息。
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);"发布于 2011-06-07 13:44:19
最后,我的解决方法是执行前一个片段的remove()并添加()新的片段。尽管这是替换()方法的本意。
但是,我仍然在猜测为什么替换()方法在这种情况下不能正常工作。这真的很奇怪,我想抛弃它是因为我误解了什么或做错了什么。
发布于 2011-06-06 15:04:43
如果活动的状态已经保存,那么调用提交就不再安全了。您必须调用commitAllowingStateLoss()。希望这能有所帮助!
编辑:好的,我已经仔细研究过您的问题,问题是您正在尝试添加一个已经添加的片段。即使使用替换或删除调用,也不能这样做。我发现的唯一方法就是创建一个片段的新实例,并每次添加它。一旦删除或替换了一个片段,最好删除对它的所有引用,以便GC能够处理它。
发布于 2012-02-16 08:43:06
可能与此问题没有直接关系,但我也注意到,设置到FragmentTransaction的转换将导致IllegalStateException,而不设置转换则不会。
下面是这个问题的bug:http://code.google.com/p/android/issues/detail?id=25598
https://stackoverflow.com/questions/6250580
复制相似问题