I get this error whenever I have my main activity with a fragment loaded and the user starts a new activity, switches the orientation of the device and comes back to main activity.
@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();
}
}
In my android manifest, the activity is declared as:
<activity
android:name=".HomeActivity"
android:configChanges="keyboardHidden|orientation" />
<activity
In another questions here on SO, I have found that this may be caused by a bug in Support library do I added without any luck:
// 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);
}
My app runs from android 2.2 and I’m using the android-support-v4.jar Support library for fragments.
The log looks like:
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)
First, as I can see, you want to handle configuration changes yourself. In order to let things to work properly with API Level 13+, you have to add one more value to
configChangesparameter, as described here.Next, when the user leave your main activity,
onSaveInstanceStateandonPausemethods are called for it. When the user rotates device and come back to your main activity.onConfigurationChangedmethod is called beforeonResume(). So, your activity is still paused and you cannot performFragmentTransaction.Further more, if we take a look into source code we can see the following comment for
onResumemethod:So, the right place to manipulate fragments in your activity is overriding
onResumeFragmentsmethod, as we can read in the comment for this method in source code: