ประการแรก ฉันเชื่อว่านี่ไม่ใช่คำถามที่ซ้ำกัน แม้ว่าจะมีการถามวิธีแก้ไขข้อผิดพลาดหลายครั้งก็ตาม ฉันได้ลองใช้วิธีแก้ไขปัญหาที่แตกต่างกันอย่างน้อย 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 จะถูกทริกเกอร์เมื่อกดปุ่มล็อคหน้าจอ