579 Stimmen

IllegalStateException: Diese Aktion kann nicht nach onSaveInstanceState mit ViewPager durchgeführt werden

Ich erhalte Benutzerberichte von meiner App auf dem Markt, die die folgende Ausnahme liefern:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyUp(Activity.java:2044)
at android.view.KeyEvent.dispatch(KeyEvent.java:2529)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.widget.TabHost.dispatchKeyEvent(TabHost.java:297)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2880)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2853)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2028)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4028)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
at dalvik.system.NativeStart.main(Native Method)

Offenbar hat es etwas mit einem FragmentManager zu tun, den ich nicht verwende. Der Stacktrace zeigt keine meiner eigenen Klassen, daher habe ich keine Ahnung, wo diese Ausnahme auftritt und wie ich sie verhindern kann.

Für das Protokoll: Ich habe einen Tabhost, und in jedem Tab gibt es eine ActivityGroup, die zwischen den Activities wechselt.

1voto

Volodymyr Punkte 6115

Ab der Version 24.0.0 der Support-Bibliothek können Sie FragmentTransaction.commitNow() Methode, die diese Transaktion synchron festschreibt, anstatt die commit() gefolgt von executePendingTransactions() . Als [Dokumentation](https://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html#commitNow()) sagt diesen Ansatz noch besser:

Der Aufruf von commitNow ist dem Aufruf von commit() gefolgt von executePendingTransactions() vorzuziehen, da letzteres den Nebeneffekt hat, dass versucht wird, alle derzeit anstehenden Transaktionen zu übertragen, unabhängig davon, ob dies das gewünschte Verhalten ist oder nicht.

1voto

Levon Petrosyan Punkte 6904

Um dieses Problem zu umgehen, können wir Folgendes verwenden Die Navigationsarchitektur-Komponente , die auf der Google I/O 2018 vorgestellt wurde. Die Navigationsarchitekturkomponente vereinfacht die Implementierung der Navigation in einer Android-App.

1voto

ralphgabb Punkte 9768

Ich weiß, dass es eine akzeptierte Antwort von @Ovidiu Latcu gibt, aber nach einiger Zeit bleibt der Fehler weiterhin bestehen.

@Override
protected void onSaveInstanceState(Bundle outState) {
     //No call for super(). Bug on API Level > 11.
}

Crashlytics schickt mir immer noch diese seltsame Fehlermeldung.

Allerdings tritt der Fehler nur noch bei Version 7+ (Nougat) auf. Meine Lösung war die Verwendung von commitAllowingStateLoss() anstelle von commit() bei der fragmentTransaction.

Este Beitrag ist hilfreich für commitAllowingStateLoss() und hatte nie wieder ein Fragmentproblem.

Zusammenfassend lässt sich sagen, dass die hier akzeptierte Antwort auf Android-Versionen vor Nougat funktionieren könnte.

Dies könnte jemandem einige Stunden der Suche ersparen. Viel Spaß beim Kodieren. <3 Prost

0voto

yifan Punkte 183

Fügen Sie dies zu Ihrer Aktivität hinzu

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    if (outState.isEmpty()) {
        // Work-around for a pre-Android 4.2 bug
        outState.putBoolean("bug:fix", true);
    }
}

0voto

Samet ÖZTOPRAK Punkte 2702

Ich hatte genau das gleiche Problem. Es passierte wegen der Zerstörung der vorherigen Aktivität. Als ich die vorherige Aktivität zurücksetzte, wurde sie zerstört. Ich habe es Basis-Aktivität (WRONG)

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    SpinnerCustom2.setFragmentManager(getSupportFragmentManager());
    onCreateDrawerActivity(savedInstanceState);
}

Ich habe es in onStart eingegeben und es war RICHTIG

@Override
protected void onStart() {
    super.onStart();
    SpinnerCustom2.setFragmentManager(getSupportFragmentManager());

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X