/ / IllegalStateException no FragmentManager - android, fragmento, illegalstateexception, fragmento-tab-host

IllegalStateException no FragmentManager - android, fragment, illegalstateexception, fragmento-tab-host

Meu aplicativo continua relatando esse problema em muitos dispositivos Androidplataformas (4.1, 4.0.4, 2.3.6 ...). Mas não consegui reproduzir este problema no meu telefone. Eu pesquisei esse problema pelo Google, mas o rastreamento de pilha não parece o mesmo que o meu.

Alguém sabe como o problema está acontecendo? E como evitar isso? Ou como posso reproduzir esse erro? Obrigado.

Rastreamento de pilha:

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)

-------------------- Editar --------------------

Para Jonathan:

Eu tenho dois fragmentos. E apenas um fragmento substitui o onPause retorno de chamada, e os códigos são como abaixo. E eu não sobrescrevo os outros callbacks depois onPause. Outro callback que eu sobrescrevo é o onResume retorno de chamada, os códigos são como abaixo também.

Fragmento:

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

Minha visão:

public void onPause() {
pause = true;
}

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

Eu também traço os códigos de FragmentActivity/FragmentManager, parece que o onAttachedToWindow() ser chamado antes onPostResume(), então a questão vai acontecer. É possível que o onAttachedToWindow() ser chamado antes onPostResume()?

Respostas:

9 para resposta № 1

Esse problema é causado pelo comprometimento de um fragmento depois que a atividade é onPaused.

Uma solução simples é usar FragmentTransaction.commitAllowingStateLoss() ao invés de FragmentTransaction.commit()