片段已添加IllegalStateException异常 [英] Fragment already added IllegalStateException

查看:242
本文介绍了片段已添加IllegalStateException异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用这个方法对我的容器的活动表现出BFrag

 公共无效showBFrag()
{
    //开始一个新的FragmentTransaction
    FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction();

    如果(mBFrag.isAdded())
    {
        Log.d(LOG_TAG,展()BFrag);
        fragmentTransaction.show(mBFrag);
    }
    其他
    {
        Log.d(LOG_TAG,更换AFrag  - > BFrag);
        fragmentTransaction.replace(R.id.operation_fragments_frame,mBFrag);
    }

    //保持在后面堆栈中的事务,因此将发生逆转时,后退按钮是pressed
    fragmentTransaction.addToBackStack(空);

    //提交事务
    fragmentTransaction.commit();
}
 

我把它从我的容器的活动;首次

  • 进入else语句和mBFrag更换mAFrag。

然后我preSS后退按钮:

  • ,操作是相反的(mAFrag示出但..没有mBFrag除去?)。

然后我再往前走由同一活动调用showBFrag():

  • 连带又进了else语句。 (这样我就可以推断出mBFrag不添加)
  • ,但我得到了一个碎片已添加IllegalStateException异常 ...(所以为什么没有进入if语句呢?)

所以:

  1. 为什么isAdded()方法没有返回TRUE,如果我得到一个碎片已添加IllegalStateException异常
  2. 是否popBackStack操作完全删除previously添加片段?
  3. 在我误解是什么行为?

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

  12月6日至七日:08:32.730:ERROR / AndroidRuntime(8576):java.lang.IllegalStateException:碎片已添加:BFrag {40b28158 ID = 0x7f0c0085}
12月6日至七日:08:32.730:ERROR / AndroidRuntime(8576):在android.app.BackStackRecord.doAddOp(BackStackRecord.java:322)
12月6日至七日:08:32.730:ERROR / AndroidRuntime(8576):在android.app.BackStackRecord.replace(BackStackRecord.java:360)
12月6日至七日:08:32.730:ERROR / AndroidRuntime(8576):在android.app.BackStackRecord.replace(BackStackRecord.java:352)
12月6日至七日:08:32.730:ERROR / AndroidRuntime(8576):在myPackageName.containerActivity.showBFrag()//这行:fragmentTransaction.replace(R.id.operation_fragments_frame,mBFrag);
 

解决方案

最后,我的解决方法已经执行previous片段删除(),并添加()新的。虽然这就是<一href="http://developer.android.com/reference/android/app/FragmentTransaction.html#replace%28int,%20android.app.Fragment,%20java.lang.String%29">replace() 是为了做方法...

但我仍然猜测为什么replace()方法并没有在这种情况下工作得很好......真是奇怪,我想放弃,这是因为我误解的东西,或做错了什么。

I use this method on my container Activity to show a 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();        
}

I call it from my container Activity; for the first time:

  • gets into the else statement and mBFrag replace mAFrag.

Then I press the back button:

  • and the operation is reversed (mAFrag is shown but.. does mBFrag is removed?).

Then I go forward again by calling showBFrag() from the same Activity:

  • and it gets AGAIN into the else statement. (so I can deduce that mBFrag is NOT ADDED)
  • but I got a Fragment already added IllegalStateException... (so why it didn't get into the if statement instead?)

So:

  1. Why is the isAdded() method not returning TRUE if I'm getting a Fragment already added IllegalStateException??
  2. Does popBackStack operation completely remove previously added fragments?
  3. What behaviour am I misunderstanding?

EDIT: Here is the complete info of the exception.

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

解决方案

Finally my workaround has been to execute remove() of the previous fragment and add() the new one. Although that's what replace() method was meant to do...

But I still guessing why replace() method didn't worked fine in this case... is really weird and I want to discard that it is because I am misunderstanding something or doing something wrong.

这篇关于片段已添加IllegalStateException异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆