天天看點

Fragment IllegalStateException: Can not perform this action after onSaveInstanceState

http://blog.csdn.net/top_code/article/details/12614571

在使用Fragment的FragmentTransaction commit 時候經常會碰到下面的錯誤:

[html]  view plain copy

  1. java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState  
  2.     at android.support.v4.app.FragmentManagerImpl.checkStateLoss(Unknown Source)  
  3.     at android.support.v4.app.FragmentManagerImpl.enqueueAction(Unknown Source)  
  4.     at android.support.v4.app.BackStackRecord.commitInternal(Unknown Source)  
  5.     at android.support.v4.app.BackStackRecord.commit(Unknown Source)  
  6.     at com.yulore.yellowpage.DialLogActivity.a(Unknown Source)  
  7.     at com.yulore.yellowpage.fragment.x.handleMessage(Unknown Source)  
  8.     at android.os.Handler.dispatchMessage(Handler.java:99)  
  9.     at android.os.Looper.loop(Looper.java:137)  
  10.     at android.app.ActivityThread.main(ActivityThread.java:4797)  
  11.     at java.lang.reflect.Method.invokeNative(Native Method)  
  12.     at java.lang.reflect.Method.invoke(Method.java:511)  
  13.     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)  
  14.     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)  
  15.     at dalvik.system.NativeStart.main(Native Method)  

檢視Developer文檔 commit 方法說明

Fragment IllegalStateException: Can not perform this action after onSaveInstanceState

解決辦法

把commit()方法替換成 commitAllowingStateLoss() 

[java]  view plain copy

  1. ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);  
  2.         if (this.isFinishing()) {   //判斷Activity是否還存在  
  3.             return;  
  4.         }  
  5.         ft.commitAllowingStateLoss();  
  6. //      ft.commit();  

20. 在debug帶有android.support.v4的包時,結果出現下面的錯誤:

  05-10 15:47:09.850: E/AndroidRuntime(12744): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

比較完整的stack如下:

1

05

-

10

15

:

47

:

06.470

: W/dalvikvm(

12744

): threadid=

1

: thread exiting with uncaught exception (group=

0x40a4b1f8

)

2

05

-

10

15

:

47

:

09.850

: E/AndroidRuntime(

12744

): FATAL EXCEPTION: main

3

05

-

10

15

:

47

:

09.850

: E/AndroidRuntime(

12744

): java.lang.IllegalStateException: Can not perform 

this

action after onSaveInstanceState

4

05

-

10

15

:

47

:

09.850

: E/AndroidRuntime(

12744

):    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:

1299

)

5

05

-

10

15

:

47

:

09.850

: E/AndroidRuntime(

12744

):    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:

1310

)

6

05

-

10

15

:

47

:

09.850

: E/AndroidRuntime(

12744

):    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:

541

)

7

05

-

10

15

:

47

:

09.850

: E/AndroidRuntime(

12744

):    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:

525

)

8

05

-

10

15

:

47

:

09.850

: E/AndroidRuntime(

12744

):    at android.support.v4.app.DialogFragment.show(DialogFragment.java:

123

)

在此處有人也一個有點類似問題:

http://stackoverflow.com/questions/7575921/illegalstateexception-can-not-perform-this-action-after-onsaveinstancestate-h

我看到上面有提到onSaveInstanceState(),于是就重寫了下這個.像上面說的不能調用super.我調用了,而且居然就tmd沒有錯誤提示了..

19.05-10 16:08:43.190: E/AndroidRuntime(14243): java.lang.IllegalStateException: addToBackStack() called after commit()

繼續閱讀