Во-первых, я считаю, что это не дублирующий вопрос, хотя решение ошибки задавали много раз. Я пробовал по крайней мере 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 сработает при нажатии кнопки блокировки экрана?