Fragment Android et changement d'orientation provoquant: IllegalStateException: Impossible d'effectuer cette action après onSaveInstanceState
J'ai cette erreur à chaque fois que j'ai mon activité principale, avec un fragment chargé et que l'utilisateur démarre une nouvelle activité, change l'orientation de l'appareil et revient à l'activité principale.
@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();
}
}
Dans mon manifeste android, l'activité est déclarée comme suit:
<activity
android:name=".HomeActivity"
android:configChanges="keyboardHidden|orientation" />
<activity
Dans un autre questions ici, j'ai trouvé que cela peut être causé par un bogue dans le Soutien de la bibliothèque, j'ai ajouté sans un peu de chance:
//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);
}
Mon application fonctionne à partir d'android 2.2 et je suis en utilisant le android-support-v4.jar bibliothèque de prise en charge pour des fragments.
Le journal se présente comme:
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)
source d'informationauteur Alin
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, comme je peux voir, vous voulez gérer les changements de configuration vous-même. Afin de laisser les choses à travailler correctement avec l'API de Niveau 13+, vous devez ajouter un plus de valeur à
configChanges
paramètre, tel que décrit ici.Ensuite, lorsque l'utilisateur de quitter votre activité principale,
onSaveInstanceState
etonPause
méthodes sont appelées pour cela. Lorsque l'utilisateur fait pivoter l'appareil et revenir à votre activité principale.onConfigurationChanged
méthode est appelée avantonResume()
. Si votre activité est toujours en pause et que vous ne pouvez pas effectuerFragmentTransaction
.De plus, si nous prenons un coup d'oeil dans le code source, nous pouvons voir le commentaire suivant pour
onResume
méthode:Donc au bon endroit pour manipuler des fragments dans votre activité est primordial
onResumeFragments
méthode, comme nous pouvons le lire dans le commentaire de cette méthode dans le code source:Si comme StenaviN suggère
onConfigurationChange()
est retourné avant de reprendre() de revenir à votre activité:C'est le cycle de vie:
Mais l'important, c'est que
Si vous reprenez une
Activity
ou de changement de laOrientation
d'unActivity
votreFragments
ira bien! Vous n'avez pas besoin de remplacer l'ancienne par une nouvelle copie et en fait, vous ne devriez pas! Si vous retirez simplement cette ligne, vous n'aurez pas un problème:cependant Si vous faites cela parce que vous avez besoin de votre
Fragment
pour charger une nouvelle mise en page de ressources (layout/frag.xml
=>layout-land/frag.xml
), alors vous allez avoir besoin de faire quelque chose comme ceci:Êtes-vous à l'aide de la dernière version de l'appui-v4 bibliothèque? Il fixe mon problème similaire.
Si vous êtes coincé à la version r7 de la bibliothèque de prise en charge (par exemple parce que vous êtes à l'aide de maven et desesperatly en attente d'une mise à jour.. 😉 ), vous pouvez utiliser
onPostResume
pour éviter ce problème. Si votre version est r11, ou au-dessus, alors vous pouvez passer àonResumeFragements
.