web-dev-qa-db-ja.com

Android-IllegalStateExceptionが原因で、終了後にアクティビティを破棄できません:onSaveInstanceStateの後にこのアクションを実行できません

アプリに3つのフラグメントを持つアクティビティがあります。最初のボタンが押されると、アクティビティでメソッドが呼び出され、無関係な処理が実行されてから、finish()が呼び出されます。

これにより、フラグメントでonPause()がトリガーされ、より無関係な処理が実行されてから、super.onPause()が呼び出されます。

次に、アプリは(論理的にはビュースタックに続いて)発生した古いアクティビティをロードし、フラグメントでonDestroyView()が呼び出されると、次の例外を除いて突然クラッシュします。

FATAL EXCEPTION: main
Java.lang.RuntimeException: Unable to destroy activity {be.niteowl.niteowl.debug/be.niteowl.niteowl.views.activities.VenueActivity}: Java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at Android.app.ActivityThread.performDestroyActivity(ActivityThread.Java:2793)
at Android.app.ActivityThread.handleDestroyActivity(ActivityThread.Java:2811)
at Android.app.ActivityThread.access$2100(ActivityThread.Java:123)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:972)
at Android.os.Handler.dispatchMessage(Handler.Java:99)
at Android.os.Looper.loop(Looper.Java:130)
at Android.app.ActivityThread.main(ActivityThread.Java:3835)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:507)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:864)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:622)
at dalvik.system.NativeStart.main(Native Method)
Caused by: 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 be.niteowl.niteowl.views.activities.TrackFragment.onDestroyView(TrackFragment.Java:161)
at Android.support.v4.app.Fragment.performDestroyView(Fragment.Java:1665)
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:980)
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1088)
at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1070)
at Android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.Java:1898)
at Android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.Java:324)
at com.actionbarsherlock.app.SherlockFragmentActivity.onDestroy(SherlockFragmentActivity.Java:88)
at Android.app.ActivityThread.performDestroyActivity(ActivityThread.Java:2780)
... 11 more

メインフラグメントからMapFragmentを削除しようとすると、エラーが発生したようです。フラグメント内にフラグメントがあるはずがないことは知っていますが、コードは過去に機能しており、とにかくそれを回避する方法はありません。

@Override
public void onDestroyView() {
    SupportMapFragment f = (SupportMapFragment) activity.getSupportFragmentManager().findFragmentById(R.id.fragment_map);
    if (f != null) {
        activity.getSupportFragmentManager().beginTransaction().remove(f).commit();
    }
    super.onDestroyView();
}

私はここでSOすでに(特に 例外 "IllegalStateException:onSaveInstanceStateの後にこのアクションを実行できません" )で修正を探しましたが、どれも適用できませんでした私の現在の問題に。

16
Vindicator

アクティビティが破棄されているため、フラグメントは自動的に破棄されます。したがって、それらを削除する必要はありません。 onDestroyView()メソッドを削除するだけです。

フラグメント内にフラグメントがあるはずがないことは知っていますが、コードは過去に機能しており、とにかくそれを回避する方法はありません。

まず、フラグメント内のフラグメントは、AndroidサポートパッケージのフラグメントのバックポートとネイティブAndroid 4.2+フラグメントの実装)を介してサポートされます。

次に、少なくともここに示すコードに基づいて、フラグメント内でフラグメントを実行していません。何らかの理由で、あなたのTrackFragmentは、その作業をアクティビティに委任するのではなく、別のトップレベルフラグメント(あなたのSupportMapFragment)を管理しています。

8
CommonsWare

次のコードは私のために働いた。マップフラグメントを呼び出すフラグメントに配置されます

@Override
public void onDestroy() {

    SupportMapFragment f = (SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapView);
    if (f.isResumed()){ 
        getFragmentManager().beginTransaction().remove(f).commit();
    }

    super.onDestroy();
}
18
lytridic

OnPostResume()コールバックでトランザクションをコミットすると、問題が修正されました。次のブログ投稿に感謝します http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

@Override
protected void onPostResume() {
    super.onPostResume();
    // Commit your transactions here.
}
0
Varun Bhatia

アクティビティが破棄され、フラグメントが破棄されるため、.commit()を処理できません。

GetSupportFragmentManager()。beginTransaction()。remove()。commit()を削除します。

アプリケーションに対して行ったonBackPressed()で処理してみてください

0
ranjith Gampa