該問題是由於要顯示的Fragment已經存在與記錄當中,但是你又第二次add.
if (!fragment.mDetached) { 1218 if (mAdded.contains(fragment)) { 1219 throw new IllegalStateException("Fragment already added: " + fragment); 1220 } 1221 mAdded.add(fragment); 1222 fragment.mAdded = true; 1223 fragment.mRemoving = false; 1224 if (fragment.mHasMenu && fragment.mMenuVisible) { 1225 mNeedMenuInvalidate = true; 1226 } 1227 if (moveToStateNow) { 1228 moveToState(fragment); 1229 } 1230 }
這是FragmentManager.java中的源代碼,這段代碼應該屬於異步。所以不管你的Fragment相關的狀態有沒有更新或處理完成,即使來了相同的Fragment這段代碼也會執行。就像上面的代碼,對於add相同的F(Fragment),F已經存在mAdded中了,你還往裏面添加,肯定會拋出異常了。
對於開發應用而言,可以先判斷記錄中是否存在該Fragment。若存在,則可以直接show或者可以先remove再add,肯定還有其它方法,請自行嘗試找出。
對於在系統方面解決這個問題,我的方法是對該代碼加上同步塊,另外在進入if語句之後先remove掉之前的fragment。該方法暫時解決了這個問題,不知道是不是有什麼嚴重的後遺症,如有不對的地方,請各位大神進行指點改正。謝謝!