Android之提示错误Can not perform this action after onSaveInstanceState
16lz
2021-01-26
1 问题
主页面3个Fragment,在第三个Fragment里面开启了Activity之后,然后想跳到第一个Fragment代码如下
/** * 展示Fragment */ private fun showFragment(fragment: Fragment) { if (currentFragment !== fragment) { val transaction: FragmentTransaction = supportFragmentManager.beginTransaction() transaction.hide(currentFragment) currentFragment = fragment if (!fragment.isAdded) { transaction.add(R.id.mainFrameLayout, fragment).show(fragment).commit() } else { transaction.show(fragment).commit() } } }
然后奔溃错误提示如下
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at androidx.fragment.app.FragmentManagerImpl.checkStateLoss(FragmentManagerImpl.java:1536) at androidx.fragment.app.FragmentManagerImpl.enqueueAction(FragmentManagerImpl.java:1558) at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:317) at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:282) at com.appsinnova.android.keepdrop.home.MainActivity.showFragment(MainActivity.kt:671) at com.appsinnova.android.keepdrop.home.MainActivity.updateMain(MainActivity.kt:286) at java.lang.reflect.Method.invoke(Native Method) at org.greenrobot.eventbus.EventBus.invokeSubscriber(EventBus.java:507) at org.greenrobot.eventbus.EventBus.postToSubscription(EventBus.java:434) at org.greenrobot.eventbus.EventBus.postSingleEventForEventType(EventBus.java:411) at org.greenrobot.eventbus.EventBus.postSingleEvent(EventBus.java:384) at org.greenrobot.eventbus.EventBus.post(EventBus.java:265) at org.greenrobot.eventbus.EventBus.postSticky(EventBus.java:306) at com.appsinnova.android.keepdrop.fragment.MyVedioLikeListFragment$onCreateView$1.onClick(MyVedioLikeListFragment.kt:70) at android.view.View.performClick(View.java:6659) at android.view.View.performClickInternal(View.java:6631) at android.view.View.access$3100(View.java:790) at android.view.View$PerformClick.run(View.java:26187) at android.os.Handler.handleCallback(Handler.java:907) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:216) at android.app.ActivityThread.main(ActivityThread.java:7625) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
2 解决办法
onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后 再给它添加Fragment就会出错。解决办法就是把commit()方法替换成 commitAllowingStateLoss()
fun newshowFragment(fragment: Fragment) { if (currentFragment !== fragment) { val transaction: FragmentTransaction = supportFragmentManager.beginTransaction() transaction.hide(currentFragment) currentFragment = fragment if (!fragment.isAdded) { transaction.add(R.id.mainFrameLayout, fragment).show(fragment).commitAllowingStateLoss() } else { transaction.show(fragment).commitAllowingStateLoss() } } }
更多相关文章
- Android中多USB摄像头解决方案——UVCCamera
- 【学习笔记】Android中Service通信
- 最新Android面试题整理 5月
- Flutter 与 Native 混合开发
- Android(安卓)4.4 KitKat NotificationManagerService使用详解与
- Android(安卓)Studio中使用java8
- android 自定义Toast,可设定显示时间
- 如何将当前布局用代码保存在png图像文件中?
- android学习笔记(一) 遍历SD卡中所有文件并在listview中显示