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:
- Why is the isAdded() method not returning TRUE if I'm getting a Fragment already added IllegalStateException??
- Does popBackStack operation completely remove previously added fragments?
- 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);"
Removing
setOffscreenPageLimit
fromViewpager
solved my issue. Thanks.Probably not related to this issue directly, but I've also noticed that setting a transition to the FragmentTransaction will cause an IllegalStateException, while not setting a transition will not.
Here's the bug for this issue: http://code.google.com/p/android/issues/detail?id=25598
Solved it by looping through my fragments and checking if isAdded() is true, then removing that fragment. More details here.
try this after fragmentTransection.replace()
I used this:
and added fragment with
MyFragment.class.getName()
stands fortag
I tried calling
FragmentTransaction.remove()
fromonTabUnselected()
and it worked around this bug.