30
09-19 12:23:01.084: E/AndroidRuntime(24169): FATAL EXCEPTION: main 
09-19 12:23:01.084: E/AndroidRuntime(24169): Process: com.example.loan, PID: 24169 
09-19 12:23:01.084: E/AndroidRuntime(24169): java.lang.IllegalStateException: Fragment already added: FormFragment{428f10c8 #1 id=0x7f050055 form} 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1192) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:722) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1533) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl$2.run(FragmentManager.java:489) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1484) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:450) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Handler.handleCallback(Handler.java:733) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Handler.dispatchMessage(Handler.java:95) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.os.Looper.loop(Looper.java:136) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at android.app.ActivityThread.main(ActivityThread.java:5068) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at java.lang.reflect.Method.invokeNative(Native Method) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at java.lang.reflect.Method.invoke(Method.java:515) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
09-19 12:23:01.084: E/AndroidRuntime(24169): at dalvik.system.NativeStart.main(Native Method) 

因此,我有一個與tabhost構建的android應用程序。有三個選項卡總,在TAB2,有一個按鈕,以使TAB2片段事務(調用函數中的片段活動)IllegalStateException:片段已經添加在tabhost片段中

FragmentTransaction t = getSupportFragmentManager().beginTransaction(); 
     t.replace(R.id.realtabcontent, mFrag); 
     t.addToBackStack(null); 
     t.commit(); 

有異常,如果我像這樣運行:

  1. 的TAB2內,我按按鈕
  2. 轉到改變片段到其它選項卡(例如,標籤1或選項卡3)
  3. 按下後退按鈕
  4. 拋出異常

如何解決這個問題?感謝您的幫助

+0

可能重複的[IllegalStateException:如果應用程序在後臺非常長已添加碎片](http://stackoverflow.com/questions/24629080/illeg alstateexception-fragment-already-added-appear-if-a-app-was-very-long-in) – FWeigl 2014-09-19 04:36:00

+0

這意味着backpress正在添加一個新片段,那麼backstack中的邏輯是什麼?非常感謝 – user782104 2014-09-19 04:37:20

+0

是mFrag被添加到除tab2之外的其他選項卡? – Akhil 2014-09-19 06:29:18

回答

66

發生這種情況時,我們試圖解僱前添加相同片段或DialogFragment兩次,

只是打電話

if(mFragment.isAdded()) 
{ 
    return; //or return false/true, based on where you are calling from 
} 
+3

這應該是被接受的答案。被接受的答案是沒有意義的。首先,不應該否定'isAdded()'。其次,在評論中,建議這段代碼放在'onCreate()'中,這也是無意義的。這行代碼應該直接放在片段添加(或替換)的行之前,而不是放在'onCreate()'或'onCreateView()'中。在任何一種方法中執行代碼爲時已晚。 – Alex 2015-10-01 16:28:50

+0

'if(fragment.isAdded())fragmentTransaction.show(fragment);' – 2018-02-16 13:02:23

4

你只需要在以下提到的片段,以檢查一個條件:

if(!isAdded()) 
{ 
    return; 
} 

isAdded =如果片段正在加入到它的活動返回true。取自官方文件。 這不會增加,如果它已添加

檢查下面鏈接的引用片段:
http://developer.android.com/reference/android/app/Fragment.html#isAdded()

+0

感謝您的幫助,你的意思是我把if(!isAdded())放在oncreateview裏面嗎? – user782104 2014-09-19 05:48:15

+0

是的,你只需要將我在上面的回答中提到的代碼放在一起......這意味着你的片段已經被添加到堆棧中了。所以,不需要再添加它,它只是簡單地返回。 – 2014-09-19 19:08:30

+4

這沒有任何意義,你不能在onCreateView中返回void,你的意思是onCreate?我在那裏試過,它並沒有幫助我的問題 – Fonix 2015-01-19 02:34:42

1

有時它會發生沒有從各自的佈局中找到正確的ID。我面臨這個問題。幾個小時後,我發現我設置了錯誤的recyclerview id。我改變它,併爲我工作得很好。

因此,仔細檢查你的片段佈局。

+0

謝謝,這對我來說也是一樣的。異常消息不會更具誤導性。 – SqueezyMo 2018-02-09 23:07:09

2

你只需要檢查開始分段交易前一個條件

if (!fragmentOne.isAdded()){ 
      transaction = manager.beginTransaction(); 
      transaction.add(R.id.group,fragmentOne,"Fragment_One"); 
      transaction.commit(); 
} 

這是工作perfactly對我來說...

0

刪除的情況下,它仍然是添加了舊片段,然後添加新片段:

FragmentManager fm = getSupportFragmentManager(); 
Fragment oldFragment = fm.findFragmentByTag("fragment_tag"); 
if (oldFragment != null) { 
    fm.beginTransaction().remove(oldFragment).commit(); 
} 
MyFragment newFragment = new MyFragment(); 
fm.beginTransaction().add(newFragment , "fragment_tag");