Android断片配向変化を起:IllegalStateException:できないこのアクションを実行す後onSaveInstanceState

StackOverflow https://stackoverflow.com//questions/11684896

質問

取得しこのエラーはいつも私の主な活動と断片を読み込まれ、ユーザーを開始する新しい活動、スイッチの向きをデバイスとなっている主な活動です。

@Override
public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.home_layout);
    super.onCreate(savedInstanceState);
    fragmentManager = getSupportFragmentManager();
    fragment = fragmentManager.findFragmentById(R.id.layFragment);

    initialize();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
    setContentView(R.layout.home_layout);
    initialize();
    super.onConfigurationChanged(newConfig);
}

private void initialize() {
    layStatus = (LinearLayout) findViewById(R.id.layStatus);
    txtStatus = (TextView) findViewById(R.id.txtStatus);
    ....
    handleFragments(lastFragmentId);
}

public void handleFragments(int fragmentId) {
        if (fragment == null) {
            FragmentTransaction ft = fragmentManager.beginTransaction();
            if (fragmentId==someFragmentId){
                ft.replace(R.id.layFragment, new FragmentSomeFragment());
            }
            else
            ....

            ft.commit();
        }
}

私のandroidマニフェストの活動として宣言された:

 <activity
        android:name=".HomeActivity"
        android:configChanges="keyboardHidden|orientation" />
<activity

別の質問をこちらにそこで、このようなバグをサポートしないな運:

// needed as a workaround for a bug in the Support library
@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("WORKAROUND_FOR_BUG_19917_KEY", "WORKAROUND_FOR_BUG_19917_VALUE");
    super.onSaveInstanceState(outState);
}

私のアプリからandroid2.2を使用しているandroid-support-v4.jar 支援図書館の姿です。

ログに次のように記述されています。

07-27 11:56:20.399: E/AndroidRuntime(16021): FATAL EXCEPTION: main
07-27 11:56:20.399: E/AndroidRuntime(16021): java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1299)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1310)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:541)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:525)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at com.rightcab.driver.core.HomeActivity.handleFragments(HomeActivity.java:341)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at com.rightcab.driver.core.HomeActivity.initialize(HomeActivity.java:128)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at com.rightcab.driver.core.HomeActivity.onConfigurationChanged(HomeActivity.java:153)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.app.ActivityThread.performConfigurationChanged(ActivityThread.java:3618)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.app.ActivityThread.handleActivityConfigurationChanged(ActivityThread.java:3771)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1328)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.os.Looper.loop(Looper.java:137)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at android.app.ActivityThread.main(ActivityThread.java:4745)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at java.lang.reflect.Method.invokeNative(Native Method)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at java.lang.reflect.Method.invoke(Method.java:511)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
07-27 11:56:20.399: E/AndroidRuntime(16021):    at dalvik.system.NativeStart.main(Native Method)
役に立ちましたか?

解決

うにしていきたい柄の設定の変更ます。うために、も正常に動作APIレベル13+に追加すく価値 configChanges パラメータとして こちらの.

次の場合、ユーザにお任せ主な活動 onSaveInstanceStateonPause メソッド呼び出されるのです。ユーザが回転するデバイスにはメインです。 onConfigurationChanged メソッドが呼び onResume().なるほど、活動は一時停止、実行できません FragmentTransaction.

さらに、まちのソースコードし、以下のコメント onResume 方法:

派遣onResume()への姿です。に注意してくださいよ インター運営により以前のバージョンのプラットフォームのポイント この呼び出しに片付けの活動 ない を再開します。この場合には、直前の状態にあるもの 保存され、断片のおそれのある取引を変更することができる。正しい交流の断片を適切な状態です 代わりにオーバーライド{@link#onResumeFragments()}.

なので、お部屋の広さも適度で操作する断片の活動が重 onResumeFragments 方法として読み取り方ができるのにコメントこのメソッドのソースコード:

このフラグメント指向版{@link#onResume()}る をオーバーライドすることができるの操作を行うのと同 が、その破片が再開となりました。必ず常に通話を通じて のスーパークラスです。

protected void onResumeFragments() {
    super.onResumeFragments();

    // YOUR STUFF IS HERE
}

他のヒント

Stenavin を提案しています()

これはライフサイクルです:

onCreate()
onResume()
// Move away from you're Activity
onPause()
// Move back to your Activity
onConfigurationChange()
onResume()
.

しかし重要な部分はこれです:

onConfigurationChange()を再開するか、ActivityOrientationを変更すると、Activityが大丈夫になります。あなたは古いものを新しいコピーと交換する必要はありません、そして実際にはあなたがしないでください!この行を削除するだけで問題はありません。

handleFragments(lastFragmentId);
.

しかし新しいレイアウトリソースをロードするためにFragmentsFragment=> layout/frag.xml)を必要とするため、これを実行している場合は、次のようにする必要があります。

boolean mResumed = false;
onPause() {
    mResumed = false;
}

onResume() {
    mResumed = true;
} 

...

    if(mResumed) handleFragments(lastFragmentId);
.

サポートv4ライブラリの最新バージョンを使用していますか?それは私の同様の問題を修正しました。

サポートライブラリのバージョンR7に固定されている場合(たとえば、Mavenを使用しているため、アップデートを待っています。;)。あなたのバージョンがR11以上の場合は、onPostResumeに切り替えることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top