Я работаю над приложением для 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()
Если кто-то знает какое-либо альтернативное решение этой проблемы, пожалуйста, сообщите.
Заранее спасибо.