首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >片段已经添加了IllegalStateException

片段已经添加了IllegalStateException
EN

Stack Overflow用户
提问于 2011-06-06 10:16:52
回答 11查看 93K关注 0票数 56

我在容器活动中使用此方法来显示BFrag

代码语言:javascript
运行
复制
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();        
}

我第一次从集装箱活动中称它为:

  • 获取其他语句和mBFrag替换mAFrag。

然后我按后退按钮:

  • 并且操作是相反的(显示了mAFrag,但是..。mBFrag是否被删除?)。

然后,再次从相同的活动调用showBFrag():

  • 它又进入了else语句。(因此我可以推断没有添加mBFrag )
  • 但我有一个片段已经添加了IllegalStateException..。(那么为什么它没有进入if语句呢?)

所以:

  1. 如果我得到一个已经添加了isAdded()的片段,为什么IllegalStateException()方法不返回?
  2. popBackStack操作是否完全删除先前添加的片段?
  3. 我误解了什么行为?

编辑:这是异常的完整信息。

代码语言:javascript
运行
复制
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);"
EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-06-07 13:44:19

最后,我的解决方法是执行前一个片段的remove()并添加()新的片段。尽管这是替换()方法的本意。

但是,我仍然在猜测为什么替换()方法在这种情况下不能正常工作。这真的很奇怪,我想抛弃它是因为我误解了什么或做错了什么。

票数 44
EN

Stack Overflow用户

发布于 2011-06-06 15:04:43

如果活动的状态已经保存,那么调用提交就不再安全了。您必须调用commitAllowingStateLoss()。希望这能有所帮助!

编辑:好的,我已经仔细研究过您的问题,问题是您正在尝试添加一个已经添加的片段。即使使用替换或删除调用,也不能这样做。我发现的唯一方法就是创建一个片段的新实例,并每次添加它。一旦删除或替换了一个片段,最好删除对它的所有引用,以便GC能够处理它。

票数 12
EN

Stack Overflow用户

发布于 2012-02-16 08:43:06

可能与此问题没有直接关系,但我也注意到,设置到FragmentTransaction的转换将导致IllegalStateException,而不设置转换则不会。

下面是这个问题的bug:http://code.google.com/p/android/issues/detail?id=25598

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6250580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档