Android Fragment und die Ausrichtung ändern verursacht: IllegalStateException: Kann nicht diese Aktion durchführen, nachdem onSaveInstanceState
Ich bekomme diese Fehlermeldung immer, wenn ich meine main activity mit einem fragment geladen und der Benutzer startet eine neue Aktivität, schaltet die Ausrichtung des Geräts und kommt zurück in die Haupt-Aktivität.
@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 meinem android-manifest ist, wird der Vorgang erklärt:
<activity
android:name=".HomeActivity"
android:configChanges="keyboardHidden|orientation" />
<activity
In anderen Fragen hier auf, SO, ich habe gefunden, dass dies kann verursacht werden durch einen Fehler in Support library zu tun, fügte ich ohne Glück:
//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);
}
Meine app läuft ab android 2.2 und ich bin mit dem android-support-v4.jar Support Bibliothek für Fragmente.
Dem log sieht wie folgt aus:
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)
InformationsquelleAutor Alin | 2012-07-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, wie ich sehen kann, die Sie behandeln möchten änderungen an der Konfiguration selbst. Damit lassen Sie die Dinge um richtig zu arbeiten mit API-Level 13+, Sie haben zum hinzufügen von mehr Wert zu
configChanges
parameter, wie beschrieben hier.Weiter, wenn der Benutzer lassen Sie Ihre Haupttätigkeit
onSaveInstanceState
undonPause
Methoden aufgerufen werden. Wenn der Benutzer das Gerät dreht und kommen zurück, um Ihre Haupttätigkeit.onConfigurationChanged
- Methode aufgerufen wird voronResume()
. Also, Ihre Aktivität ist immer noch pausiert, und Sie können nichtFragmentTransaction
.Weiter mehr, wenn man einen Blick in den Quellcode sehen wir den folgenden Kommentar für
onResume
Methode:So, der richtige Ort, um zu manipulieren Fragmente in Ihrer Aktivität überschreiben
onResumeFragments
Methode, wie wir Lesen können, in den Kommentar für diese Methode im source-code:Wenn Sie Fragmente Ihrer Aktivität abgeleitet werden sollten, aus
FragmentActivity
und sollte Ihr Projekt in Bezug auf v4 compatibility library. onResumeFragments geschützt ist Methode derFragmentActivity
und Sie außer Kraft setzen kann!Du hast Recht ich muss schrieb es falsch ist, habe ich es erneut versucht und jetzt habe ich onResumeFragments(). Das Szenario stellte ich vor scheint zu funktionieren jetzt: onResumeFragments ich nenne die handleFragments() und kein Fehler ist trown und das layout des fragments verändert entsprechend der aktuellen Ausrichtung. Jedoch, wenn ich in der main-activity mit einem fragment auf dem Bildschirm und ändern Sie die Ausrichtung, meine handleFragmens nicht überall aufgerufen, so bleibe ich mit einer leeren Stelle, wo das fragment sein sollte. So... wie sollte ich damit umgehen handleFragment in onConfigurationChanged ?
Eigentlich denke ich, habe ich es herausgefunden: wenn ich eine Flagge in onPause und kennen die app angehalten wird, dann verwenden Sie nicht handleFragments() innerhalb onConfigurationChanged. Jetzt scheint es zu funktionieren, machen einige weitere Tests
Sie sind hier: source.android.com
InformationsquelleAutor StenaviN
Wenn StenaviN schlägt
onConfigurationChange()
wird zurückgegeben, bevor resume() auf, kommen Sie zurück zu Ihrer Tätigkeit:Dies ist der Lebenszyklus:
Aber der wichtigste Teil ist dieser:
Wenn Sie fortsetzen, ein
Activity
oder ändern Sie dieOrientation
einerActivity
IhreFragments
wird gut! Sie nicht brauchen, um die alten zu ersetzen mit einer neuen Kopie und in der Tat sollten Sie nicht! Wenn Sie einfach diese Zeile zu entfernen, die Sie nicht haben ein problem:jedoch, Wenn Sie tun dies, weil Sie brauchen Ihre
Fragment
laden Sie eine neue layout-Ressource (layout/frag.xml
=>layout-land/frag.xml
) dann sind Sie gehen zu müssen, um etwas wie das hier tun:onResume
Methode beendet. Und Sie immer noch nicht ausführen können fragment-Transaktionen. Werfen Sie einen Blick in diese Datei<sdk>\extras\android\compatibility\v4\src\java\android\support\v4\app\FragmentActivity.java
. Sie können ausführen fragment-Transaktionen entwederonPostResume
oderonResumeFragments
Methode aufrufensuper
Umsetzung vor.Ich habe nicht vorgeschlagen, den Aufruf
FragmentTransaction.commit()
in jeder anderen lifecycle-Staat als "wieder" (aka Rennen), ich schlage vor, ruft es nur, wenn ein flag, das angibt, die Aktivität ist in der richtigen Staat.Ich Verstand Sie jetzt. Aber, was ist der Sinn zu behandeln, die Orientierung auf sich selbst, wenn Sie ersetzen möchten, und Fragmente auf jeder Orientierung verpasst? Warum lassen Sie sich nicht das system Griff Orientierung, änderungen, entfernen
configChanges
parameter und setzen Sie einfach rechts layout und instanziieren richtigen Fragmente inonCreate
?Ich bin damit einverstanden - wenn Sie möchten, verwenden verschiedene Ressourcen, die Sie sollten wahrscheinlich versuchen Sie Ihr bestes, um nicht das überschreiben der config ändern.
ja, ich entledigte sich der Betreuung von config-änderungen und jetzt funktioniert es Super. Ich musste nur sicherstellen, dass die wichtigen Werte sind in eine Globale Klasse, so konnte ich schnell wiederherstellen den status der app Dank Graeme.
InformationsquelleAutor Graeme
Verwenden Sie die neueste version der support-v4-Bibliothek? Es fixiert mein ähnliches problem.
InformationsquelleAutor Stark
Wenn Sie stecken bleiben auf die version r7 des support-Bibliothek (zum Beispiel, weil Sie mit maven und desesperatly warten auf ein update.. 😉 ), dann können Sie
onPostResume
um dieses problem zu vermeiden. Wenn Ihre version ist r11 oder höher ist, dann können Sie wechseln, umonResumeFragements
.InformationsquelleAutor Snicolas