首先,我认为这不是一个重复的问题,尽管已经多次询问错误的解决方案。我尝试了至少5种不同的解决方案,但他们要么不做任何改变,要么让事情变得更糟。我希望在屏幕锁定/焦点更改时暂停活动,并允许用户在再次打开应用程序时取消暂停活动。
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (!hasFocus && pauseFragment == null) {
exercisePlayPause(isPaused, workoutExerciseNum);
isPaused = !isPaused;
}
}
exercisePlayPause调用以下方法
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之前如何使片段事务发生?
答案 0 :(得分:0)
活动的方向是sensorLandscape
。当屏幕锁定时,它将屏幕转换为纵向,当屏幕解锁时,它从纵向模式开始,然后变为横向。因此,屏幕锁定时调用了onDestroy
。当屏幕解锁时,onCreate
被调用。此方向更改将覆盖清单中设置的活动方向。通过向清单添加android:configChanges="orientation|screenSize|keyboardHidden"/>
可以控制发生此强制方向时发生的情况。这可以防止调用onDestroy和" illegalStateException"可以被选中。