添加片段以响应屏幕锁定时出现IllegalStateException

时间:2016-05-18 12:03:16

标签: android android-fragments

首先,我认为这不是一个重复的问题,尽管已经多次询问错误的解决方案。我尝试了至少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之前如何使片段事务发生?

1 个答案:

答案 0 :(得分:0)

活动的方向是sensorLandscape。当屏幕锁定时,它将屏幕转换为纵向,当屏幕解锁时,它从纵向模式开始,然后变为横向。因此,屏幕锁定时调用了onDestroy。当屏幕解锁时,onCreate被调用。此方向更改将覆盖清单中设置的活动方向。通过向清单添加android:configChanges="orientation|screenSize|keyboardHidden"/>可以控制发生此强制方向时发生的情况。这可以防止调用onDestroy和" illegalStateException"可以被选中。