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.

22voto

Jed Punkte 7732

Hier ist eine andere Lösung für dieses Problem.

Mit einer privaten Membervariable können Sie die zurückgegebenen Daten als Intent festlegen, der dann nach super.onResume() verarbeitet werden kann;

Etwa so:

private Intent mOnActivityResultIntent = null; 

@Override
protected void onResume() {
    super.onResume();
    if(mOnActivityResultIntent != null){
        ... do things ...
        mOnActivityResultIntent = null;
    }
 }

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
    if(data != null){
        mOnActivityResultIntent = data;
    }
}

14voto

Eric Brandwein Punkte 831

HINWEIS , mit transaction.commitAllowingStateLoss() könnte zu einer schlechten Erfahrung für den Benutzer führen. Weitere Informationen darüber, warum diese Ausnahme ausgelöst wird, finden Sie unter diese Stelle .

10voto

saberrider Punkte 575

Ich habe eine schmutzige Lösung für diese Art von Problem gefunden. Wenn Sie trotzdem Ihre ActivityGroups aus welchen Gründen auch immer (ich hatte zeitliche Gründe), implementieren Sie einfach

public void onBackPressed() {}

in Ihrem Activity und tun Sie etwas back Auch wenn es auf älteren Geräten keine solche Methode gibt, wird diese Methode von neueren Geräten aufgerufen.

6voto

Chandler Punkte 2455

Verwenden Sie commitAllowingStateLoss() nicht, es sollte nur für Fälle verwendet werden, in denen es in Ordnung ist, dass sich der Zustand der Benutzeroberfläche für den Benutzer unerwartet ändert.

[https://developer.Android.com/reference/Android/app/FragmentTransaction.html#commitAllowingStateLoss()](https://developer.android.com/reference/android/app/FragmentTransaction.html#commitAllowingStateLoss())

Wenn die Transaktion im ChildFragmentManager des parentFragments stattfindet, verwenden Sie parentFragment.isResume() stattdessen draußen zu überprüfen.

if (parentFragment.isResume()) {
    DummyFragment dummyFragment = DummyFragment.newInstance();
    transaction = childFragmentManager.BeginTransaction();
    trans.Replace(Resource.Id.fragmentContainer, startFragment);
}

5voto

Lawrence Kesteloot Punkte 3972

Wenn Sie erben von FragmentActivity aufrufen, müssen Sie die Oberklasse in onActivityResult() :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    ...
}

Wenn Sie dies nicht tun und versuchen, ein Fragment-Dialogfeld in dieser Methode anzuzeigen, erhalten Sie möglicherweise die OP's IllegalStateException . (Um ehrlich zu sein, verstehe ich nicht ganz por qué der Superaufruf behebt das Problem. onActivityResult() aufgerufen wird, bevor onResume() also sollte es immer noch nicht erlaubt sein, ein Fragment-Dialogfeld anzuzeigen).

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