IllegalStateException saat menambahkan fragmen sebagai respons terhadap kunci layar

Pertama, saya yakin ini bukan pertanyaan duplikat, meskipun solusi untuk kesalahan tersebut telah ditanyakan berkali-kali. Saya telah mencoba setidaknya 5 solusi berbeda tetapi tidak mengubah apa pun atau memperburuk keadaan. Saya ingin menjeda aktivitas saat layar terkunci/fokus diubah dan mengizinkan pengguna untuk membatalkan jeda aktivitas saat aplikasi dibuka kembali.

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

workoutPlayPause memanggil metode berikut

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

Ini berfungsi dengan baik ketika tombol beranda ditekan atau aplikasi lain diaktifkan atau bilah notifikasi diklik. Namun ketika layar terkunci maka saya mendapatkan error berikut

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)

Baris yang menyinggung adalah getFragmentManager().beginTransaction().add(R.id.aworkout_layout. Saya menjeda beberapa proses ketika ada peristiwa yang membuat pengguna menjauh dari aplikasi. Dan ketika pengguna kembali ke aplikasi, dia dapat melanjutkan dari sana. Oleh karena itu, saya tidak menghancurkan aktivitas tersebut. Saya telah mencoba menggunakan commitAllowingStateLoss() tetapi itu membuat saya kehilangan data untuk proses yang dijeda dan menjadi sedikit berantakan.

Jadi singkatnya pertanyaannya adalah bagaimana membuat transaksi fragmen terjadi sebelum onSaveInstanceState dipicu ketika tombol kunci layar ditekan?


person suku    schedule 18.05.2016    source sumber


Jawaban (1)


Orientasi kegiatannya adalah sensorLandscape. Saat layar terkunci, layar akan diubah menjadi potret dan saat layar dibuka kuncinya, layar dimulai dari mode potret dan kemudian menjadi lanskap. Oleh karena itu, onDestroy dipanggil ketika layar terkunci. Dan saat layar tidak terkunci, onCreate dipanggil. Perubahan orientasi ini mengesampingkan orientasi aktivitas yang ditetapkan dalam manifes. Apa yang terjadi ketika orientasi kuat ini terjadi dapat dikontrol dengan menambahkan android:configChanges="orientation|screenSize|keyboardHidden"/> ke manifes. Hal ini mencegah onDestroy dipanggil dan "illegalStateException" dapat dihindari.

person suku    schedule 19.05.2016