片段已添加 IllegalStateException

56

我在我的容器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 语句呢?)

所以:

  1. 如果我收到了 Fragment already added IllegalStateException,为什么 isAdded() 方法没有返回 TRUE?
  2. popBackStack 操作完全删除先前添加的片段吗?
  3. 我误解了什么行为?

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

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);"

1
你的片段是单例吗? - clauziere
https://twitter.com/cstruter/status/900982307812724736 - cstruter
11个回答

0

这段代码对我来说运行良好。你也可以试试。

((MiActivity)getActivity()).addAccount = new AddAccount();
((MiActivity)getActivity()).addAccount.setArguments(params);
fragmentManager = getActivity().getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container((MiActivity)getActivity()).addAccount);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接