Активность в backstack вызывает java.lang.IllegalStateException: не удается выполнить это действие после onSaveInstanceState - Android - PullRequest
0 голосов
/ 24 июня 2018

Я работаю над приложением для Android, которое выполняет 2 действия: первое - MainActivity, а второе - UpdateActivity. В моей основной деятельности у меня есть фрагменты, и в этих фрагментах я вкладываю еще один слой фрагмента, используя childFragmentManager , используя приведенный ниже код,

fun changeFragmentTransfer(int: Int,index : Int? = null){
    fragment = when(int) {
        0 -> DemoLocalFragment.newInstance(10, "")
        1 -> ConfigureLocalFragment.newInstance("","")
        2 -> LocalListingFragment.newInstance("","")
        else -> DetailLocalFragment.newInstance(index!!,"")
    }
    if (index == null)
        childFragmentManager
                .beginTransaction()
                .replace(R.id.baseLocalFrameLayout,fragment).commit()
    else {
        (activity as MainActivity).replaceFrameInMainActivity(fragment!!)
    }
}

Все работает нормально, если я открываю UpdateActivity после выполнения этой функции. Но если я запускаю UpdateActivity из MainActivity до того, как выполнение достигнет этой точки, мое приложение вылетает.

Я не понимаю, почему этот код выполняется в первую очередь, когда MainActivity находится в бэк-стеке.

Я проверил эти вопросы, относящиеся к той же теме link1 link2 link3 link4 , но здесь они предлагают использовать commitAllowingStateLoss () вместо commit () , который я не могу себе позволить, поскольку мои фрагменты зависят от этого сохраненного состояния экземпляра. Так есть альтернативное решение, в котором я могу сохранить сохраненные состояния экземпляров.

Я получаю следующие ошибки:

Процесс: com.idea_implement_india.bloombench_and_kossine.iotcontrollerapp, PID: 21132 java.lang.IllegalStateException: не может выполнить это действие после onSaveInstanceState на android.support.v4.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:2053) на android.support.v4.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:2079) на android.support.v4.app.BackStackRecord.commitInternal (BackStackRecord.java:678) на android.support.v4.app.BackStackRecord.commit (BackStackRecord.java:632) at com.idea_implement_india.bloombench_and_kossine.iotcontrollerapp.Fragments.BaseLocalFragment.changeFragmentTransfer (BaseLocalFragment.kt: 94) at com.idea_implement_india.bloombench_and_kossine.iotcontrollerapp.Fragments.BaseLocalFragment.changeFragmentTransfer $ default (BaseLocalFragment.kt: 84) at com.idea_implement_india.bloombench_and_kossine.iotcontrollerapp.Fragments.DemoLocalFragment $ subHandler $ 1.handleMessage (DemoLocalFragment.kt: 141) на android.os.Handler.dispatchMessage (Handler.java:107) на android.os.Looper.loop (Looper.java:238) на android.app.ActivityThread.main (ActivityThread.java:6016) в java.lang.reflect.Method.invoke (родной метод) на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:937) на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:798)

Здесь, в этой строке ошибки

com.idea_implement_india.bloombench_and_kossine.iotcontrollerapp.Fragments.BaseLocalFragment.changeFragmentTransfer (BaseLocalFragment.kt: 94)

соответствует этой строке в коде

    childFragmentManager
            .beginTransaction()
            .replace(R.id.baseLocalFrameLayout,fragment).commit()

Если кто-то знает какое-либо альтернативное решение этой проблемы, пожалуйста, сообщите. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Эта конкретная проблема была решена в P-версии Android. Если ваше приложение предназначено для версии ОС P, вы не получите эту ошибку, так как метод onSaveInstanceState будет вызван после onStop ().

Документация гласит

При вызове этот метод будет вызываться после onStop () для приложений. таргетинг на платформы, начиная с Build.VERSION_CODES.P. За приложения, ориентированные на более ранние версии платформы, этот метод будет происходят до onStop () и нет никаких гарантий о том, произойдет до или после onPause ()

0 голосов
/ 24 июня 2018

Этот код может потенциально выполняться, даже когда ваша MainActivity находится в заднем стеке, потому что функция commit () обрабатывает транзакцию фрагмента асинхронным способом.Ваш фрагмент добавляется через некоторое время, которое не ограничено по времени.

Одним из способов решения этой проблемы является использование commitNow () вместо commit ().Это обеспечит синхронное добавление вашего фрагмента и сохранит saveInstanceState.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...