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

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

问题描述

我在容器 Activity 上使用此方法来显示 BFrag

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:

  • 进入else语句,mBFrag替换mAFrag.

然后我按下后退按钮:

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

然后我通过从同一个 Activity 调用 showBFrag() 再次前进:

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

  • 它再次进入 else 语句.(所以我可以推断出没有添加 mBFrag)
  • 但是我得到了一个 Fragment 已经添加了 IllegalStateException...(那么为什么它没有进入 if 语句呢?)
  • 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?)

所以:

  1. 如果我收到一个 Fragment 已添加的 IllegalStateException,为什么 isAdded() 方法不返回 TRUE?
  2. popBackStack 操作是否完全删除了之前添加的片段?
  3. 我误解了什么行为?
  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?

这是异常的完整信息.

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

推荐答案

最后我的解决方法是执行前一个片段的 remove() 和 add() 新片段.虽然这就是 replace() 方法 是用来做的.

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

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

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

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

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