6

La mia app continua a segnalare questo problema su molte piattaforme Android (4.1, 4.0.4, 2.3.6 ...). Ma non ho potuto riprodurre questo problema sul mio telefono. Ho cercato questo problema da Google, ma la traccia dello stack non sembra uguale alla mia.IllegalStateException su FragmentManager

Qualcuno sa come sta accadendo il problema? E come prevenirlo? O come posso riprodurre questo errore? Grazie. traccia

Stack:

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) 

-------------------- Modifica --------------- -----

a Jonathan:

ho due frammenti. E solo un frammento sovrascrive il callback ei codici sono i seguenti. E non sovrascrivo le altre callback dopo lo . Un altro callback che sovrascrivo è il callback onResume, i codici sono ugualmente come sotto.

Frammento:

@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; 
    } 
} 

Ho anche traccio i codici dei FragmentActivity/FragmentManager, a quanto pare se la onAttachedToWindow() essere chiamato prima onPostResume(), allora il problema sarà accadere. È possibile chiamare onAttachedToWindow() prima dello onPostResume()?

+0

che cosa fate nelle vostre callback per onPause() o qualcosa più avanti nel ciclo di vita del frammento? – Jonathan

+0

Molto probabilmente un problema causato dalla rotazione dello schermo e da 'onSaveInstanceState'. Controllare la riga 'FragmentTabHost.onAttachedToWindow': 278. Inoltre, se è possibile fornire il codice per' FragmentTabHost'. – LuckyMe

+1

@LuckyMe FragmentTabHost fa parte della sorgente Android, non qualcosa che questo utente ha implementato. – Jonathan

risposta

9

Questo problema è causato dal commit di un frammento dopo che l'attività è attiva.

Una soluzione semplice è quella di utilizzare FragmentTransaction.commitAllowingStateLoss() invece di FragmentTransaction.commit()

+0

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

+0

grazie ha funzionato –

Problemi correlati