6

내 앱은 많은 Android 플랫폼 (4.1, 4.0.4, 2.3.6 ...)에서이 문제를 계속보고합니다. 하지만 휴대 전화에서이 문제를 재현하지 못했습니다. Google에서이 문제를 검색했지만 스택 추적이 내 문제와 같지 않은 것으로 보입니다.FragmentManager의 IllegalStateException

누군가 어떻게 문제가 발생했는지 알고 있습니까? 그리고 그것을 막는 방법? 또는이 오류를 어떻게 재연 할 수 있습니까? 감사합니다.

스택 추적 :

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1327) 
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1338) 
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595) 
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574) 
at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:278) 
at android.view.View.dispatchAttachedToWindow(View.java:12064) 
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2707) 
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2714) 
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2714) 
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2714) 
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:2714) 
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1339) 
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1131) 
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4611) 
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
at android.view.Choreographer.doFrame(Choreographer.java:525) 
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4898) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 
at dalvik.system.NativeStart.main(Native Method) 

-------------------- 편집 --------------- ----- 조나단으로

:

나는 두 조각이있다. 그리고 하나의 조각 만이 콜백을 덮어 씁니다. 코드는 아래와 같습니다. 그리고 이후 다른 콜백을 덮어 쓰지 않습니다. 덮어 쓰는 또 다른 콜백은 onResume 콜백입니다. 코드는 다음과 같습니다.

조각 :

@Override 
public void onPause() { 
    super.onPause(); 
    if (mView instanceof MyView) { 
     MyView my = (MyView) mView; 
     my.onPause(); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    if (mView instanceof MyView) { 
     MyView my = (MyView) mView; 
     my.onResume(); 
    } 
} 

MYVIEW :

public void onPause() { 
    pause = true; 
} 

public void onResume() { 
    pause = false; 
    if (mDialog != null && mDialog.isShowing()) { 
     mDialog.dismiss(); 
     mDialog = null; 
    } 
} 

나는 또한 onAttachedToWindow()onPostResume() 전에 다음 문제가됩니다 호출 할 경우 보인다 FragmentActivity/FragmentManager의 코드를 추적 우연히 있다. onAttachedToWindow()onPostResume() 전에 호출 할 수 있습니까?

+0

FragmentTransaction.commit()으로 사용하는 것입니다 당신은 조각의 수명주기에서 나중에 onPause에 대한 콜백에서 아무것도() 또는 아무것도 있습니까? – Jonathan

+0

화면 회전과 'onSaveInstanceState'에 의한 문제 일 가능성이 큽니다. 'FragmentTabHost.onAttachedToWindow' 행을 확인하십시오 : 278. 또한'FragmentTabHost'에 대한 코드를 제공 할 수 있다면. – LuckyMe

+1

@LuckyMe FragmentTabHost는 Android 소스에 포함되어 있으며 사용자가 구현 한 것이 아닙니다. – Jonathan

답변

9

이 문제는 활동이 onPaused 된 후에 조각을 커밋함으로써 발생합니다.

간단한 해결책은 FragmentTransaction.commitAllowingStateLoss() 대신

+0

http://stackoverflow.com/a/17527246/1284177 – Moxor

+0

감사합니다. –

관련 문제