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.

2voto

Amol Desai Punkte 792

Ich denke, mit transaction.commitAllowingStateLoss(); ist nicht die beste Lösung. Diese Ausnahme wird ausgelöst, wenn die Konfiguration der Aktivität geändert wird und das Fragment onSavedInstanceState() aufgerufen wird und danach Ihre asynchrone Callback-Methode versucht, das Fragment zu übertragen.

Eine einfache Lösung könnte darin bestehen, zu prüfen, ob die Aktivität die Konfiguration ändert oder nicht

z.B. Prüfung isChangingConfigurations()

d.h.

if(!isChangingConfigurations()) { //commit transaction. }

Kasse este auch der Link

2voto

jan4co Punkte 1542

In meinem Fall habe ich diesen Fehler in einer Überschreibungsmethode namens onActivityResult. Nachdem ich nachgeforscht habe, habe ich herausgefunden, dass ich vielleicht die Methode ' super ' vor.
Ich habe es hinzugefügt und es hat einfach funktioniert

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data); //<--- THIS IS THE SUPPER CALL
    if (resultCode == Activity.RESULT_OK && requestCode == 0) {
        mostrarFragment(FiltroFragment.newInstance())
    }

}

Vielleicht müssen Sie nur ein "super" auf jede Überschreibung Sie tun, bevor Ihr Code hinzufügen.

2voto

Tapa Save Punkte 4543

Wenn Sie einen Absturz mit popBackStack() oder popBackStackImmediate() Methode haben, versuchen Sie bitte mit fixt:

        if (!fragmentManager.isStateSaved()) {
            fragmentManager.popBackStackImmediate();
        }

Das hat bei mir auch funktioniert.

2voto

Sharath kumar Punkte 3964

Wenn Sie versuchen, ein Fragment in Ihre Aktivität zu laden, stellen Sie sicher, dass sich die Aktivität im Fortsetzungszustand befindet und nicht in den Pausenzustand übergeht, da in diesem Zustand die bereits durchgeführte Übertragung verloren gehen kann.

Sie können transaction.commitAllowingStateLoss() anstelle von transaction.commit() verwenden, um das Fragment zu laden

ou

Erstellen Sie einen Booleschen Wert und prüfen Sie, ob die Aktivität nicht pausieren wird.

@Override
public void onResume() {
    super.onResume();
    mIsResumed = true;
}

@Override
public void onPause() {
    mIsResumed = false;
    super.onPause();
}

dann beim Laden des Fragments prüfen

if(mIsResumed){
//load the your fragment
}

2voto

anoop ghildiyal Punkte 801

Wenn Sie einige FragmentTransaction in onActivityResult tun, was Sie tun können, können Sie einige boolesche Wert innerhalb onActivityResult dann in onResume können Sie Ihre FragmentTransaction auf der Grundlage der booleschen Wert tun. Bitte beachten Sie den Code unten.

@Override
protected void onResume() {
    super.onResume;
    if(isSwitchFragment){
        isSwitchFragment=false;
        bottomNavigationView.getTabAt(POS_FEED).select();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == FilterActivity.FILTER_REQUEST_EVENT && data != null) {
        isSwitchFragment=true;
    }
}

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