IllegalStateException при добавлении фрагмента в ответ на блокировку экрана

Во-первых, я считаю, что это не дублирующий вопрос, хотя решение ошибки задавали много раз. Я пробовал по крайней мере 5 различных решений, но они либо ничего не меняют, либо ухудшают ситуацию. Я хочу приостановить действие, когда экран заблокирован/изменен фокус, и позволить пользователю возобновить действие при повторном открытии приложения.

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

упражнениеPlayPause вызывает следующий метод

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);
    }
}

Это отлично работает, когда нажата кнопка «Домой», активировано какое-либо другое приложение или нажата панель уведомлений. Но когда экран заблокирован, я получаю следующую ошибку

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)

Оскорбительная строка getFragmentManager().beginTransaction().add(R.id.aworkout_layout. Я приостанавливаю несколько процессов, когда какое-либо событие заставляет пользователя покинуть приложение. И когда пользователь возвращается в приложение, он может возобновить работу оттуда. Следовательно, я не уничтожаю деятельность. Я пытался использовать commitAllowingStateLoss(), но это приводит к потере данных для приостановленных процессов и становится немного грязным.

Короче говоря, вопрос заключается в том, как сделать транзакцию фрагмента до того, как onSaveInstanceState сработает при нажатии кнопки блокировки экрана?


person suku    schedule 18.05.2016    source источник


Ответы (1)


Ориентация действия была sensorLandscape. Когда экран заблокирован, он преобразует экран в портретный, а когда экран разблокирован, он начинается с портретного режима, а затем становится ландшафтным. Следовательно, onDestroy вызывался, когда экран заблокирован. И когда экран разблокирован, вызывается onCreate. Это изменение ориентации переопределяет ориентацию активности, установленную в манифесте. Что происходит, когда происходит эта принудительная ориентация, можно контролировать, добавляя android:configChanges="orientation|screenSize|keyboardHidden"/> в манифест. Это предотвращает вызов onDestroy, и можно избежать «illegalStateException».

person suku    schedule 19.05.2016