Android断片配向変化を起:IllegalStateException:できないこのアクションを実行す後onSaveInstanceState
-
12-12-2019 - |
質問
取得しこのエラーはいつも私の主な活動と断片を読み込まれ、ユーザーを開始する新しい活動、スイッチの向きをデバイスとなっている主な活動です。
@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
パラメータとして こちらの.
次の場合、ユーザにお任せ主な活動 onSaveInstanceState
や onPause
メソッド呼び出されるのです。ユーザが回転するデバイスにはメインです。 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()
を再開するか、Activity
のOrientation
を変更すると、Activity
が大丈夫になります。あなたは古いものを新しいコピーと交換する必要はありません、そして実際にはあなたがしないでください!この行を削除するだけで問題はありません。
handleFragments(lastFragmentId);
.
しかし新しいレイアウトリソースをロードするためにFragments
(Fragment
=> layout/frag.xml
)を必要とするため、これを実行している場合は、次のようにする必要があります。
boolean mResumed = false;
onPause() {
mResumed = false;
}
onResume() {
mResumed = true;
}
...
if(mResumed) handleFragments(lastFragmentId);
. サポートv4ライブラリの最新バージョンを使用していますか?それは私の同様の問題を修正しました。
サポートライブラリのバージョンR7に固定されている場合(たとえば、Mavenを使用しているため、アップデートを待っています。;)。あなたのバージョンがR11以上の場合は、onPostResume
に切り替えることができます。