2016-05-18 11 views
0

Erstens, ich glaube, das ist keine doppelte Frage, obwohl die Lösung für den Fehler wurde oft gefragt. Ich habe mindestens 5 verschiedene Lösungen versucht, aber sie ändern nichts oder verschlimmern die Situation. Ich möchte die Aktivität pausieren, wenn der Bildschirm gesperrt/der Fokus geändert wurde und der Benutzer die Aktivität wieder aktivieren kann, wenn die App erneut geöffnet wird.IllegalStateException beim Hinzufügen von Fragment in Reaktion auf eine Bildschirmsperre

public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (!hasFocus && pauseFragment == null) { 
     exercisePlayPause(isPaused, workoutExerciseNum); 
     isPaused = !isPaused; 
    } 
} 

exercisePlayPause ruft das folgende Verfahren

public void PassExerciseNum(int exerciseNum, Boolean isPaused) { 
    if (!isPaused) { 
     pauseFragment = new PauseFragment(); 
     pauseFragment.getExNum(exerciseNum); 
     getFragmentManager().beginTransaction().add(R.id.aworkout_layout, pauseFragment, "pause").commit(); 
    } else { 
     getFragmentManager().beginTransaction().remove(pauseFragment).commit(); 
     pauseFragment = null; 
     exercisePlayPause(true, exerciseNum); 
    } 
} 

Dies funktioniert gut, wenn die Home-Taste gedrückt wird oder eine andere App aktiviert ist oder die Benachrichtigungsleiste geklickt wird. Aber wenn der Bildschirm gesperrt ist, dann bekomme ich folgende Fehler

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 
                     at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1411) 
                     at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1429) 
                     at android.app.BackStackRecord.commitInternal(BackStackRecord.java:687) 
                     at android.app.BackStackRecord.commit(BackStackRecord.java:663) 

Die Codezeile getFragmentManager().beginTransaction().add(R.id.aworkout_layout ist. Ich pausiere einige Prozesse, wenn ein Ereignis den Benutzer von der App wegbewegt. Und wenn der Benutzer zur App zurückkehrt, kann er von dort aus weitermachen. Daher zerstöre ich die Aktivität nicht. Ich habe versucht, commitAllowingStateLoss() zu verwenden, aber das macht mich Daten für die pausierten Prozesse verlieren und wird ein bisschen chaotisch.

Kurz gesagt ist die Frage, wie man eine Fragmenttransaktion passieren lässt, bevor onSaveInstanceState ausgelöst wird, wenn die Bildschirmsperrtaste gedrückt wird?

Antwort

0

Die Ausrichtung der Aktivität war sensorLandscape. Wenn ein Bildschirm gesperrt wird, wird der Bildschirm in Hochformat umgewandelt, und wenn der Bildschirm entsperrt ist, beginnt er mit einem Hochformat und wird dann in Querformat. Daher wurde onDestroy aufgerufen, wenn der Bildschirm gesperrt ist. Und wenn der Bildschirm entsperrt ist, wird onCreate aufgerufen. Diese Orientierungsänderung überschreibt die in manifest festgelegte Ausrichtung der Aktivität. Was passiert, wenn diese kraftvolle Orientierung geschieht, kann durch Hinzufügen von android:configChanges="orientation|screenSize|keyboardHidden"/> zum Manifest gesteuert werden. Dies verhindert, dass onDestroy aufgerufen wird und die "illegalStateException" kann aufgehoben werden.

Verwandte Themen