我有以下情况
我们举一个例子:
我有FirstActivity,它包含两个片段。 Fragment-A默认加载到FirstActivity.By单击Fragment-A屏幕上的按钮移动到Fragment-B,它将添加到后面的堆栈。从Fragment-B开始,有一个按钮,我可以访问第二个活动。现在,如果发生任何事件,我正在调用 FragmentManager.popBackStack 方法将Fragment-B移动到Fragment-A(这是应用程序要求),那时我的应用程序崩溃了。因为我在FirstActivity上调用SecondActivity和 FragmentManager.popBackStack 。
现在我的代码
从Fragment-A转移到Fragment-B
MenuFragment menuFragment = MenuFragment.newInstance(orderObject.getOrderTableName(), orderObject.getTableSize(), arraySeatCount[k], arrayTableCode[k], arrayTableId[k], floorDetailObject.getId(), TabRabbitConstant.OrderType.DINEIN.orderType, "", "", false);
menuFragment.setTargetFragment(FloorFragment.this, UserDefault.ORDER_MENU);
FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frameContainer, menuFragment, getResources().getString(R.string.M_MENU));
fragmentTransaction.addToBackStack(getResources().getString(R.string.M_MENU));
fragmentTransaction.commit();
当发生任何事件时,我在FirstActivity上调用popbackstack
FragmentManager manager = getSupportFragmentManager();
manager.popBackStack();
我的应用程序崩溃时遇到的异常
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1842)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1860)
at android.support.v4.app.FragmentManagerImpl.popBackStack(FragmentManager.java:770)
at com.app.tabrabbitpos.MainActivity.parseResponseInMain(MainActivity.java:691)
at com.app.tabrabbitpos.base.BaseActivity$3.run(BaseActivity.java:192)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
FragmentManager.popBackStack的文档写了
此函数是异步的 - 它将请求排入pop,但在应用程序返回其事件循环之前不会执行该操作。
所以根据文档,我认为它应该工作,但它给了我异常,我的应用程序崩溃了。
我已经检查了此链接以查找我的问题但未获得任何解决方案
Is it safe to call FragmentManager.popBackStack when activity is paused
简而言之,我的问题是 如何在活动暂停时调用FragmentManager.popBackStack? (表示我正在进行第二次活动且FirstActivity处于暂停状态时)
答案 0 :(得分:0)
创建一个布尔值,以检查活动是否第一次运行,如此
private Boolean mFirstRun = false;
然后在第一个活动onResume中检查活动是否第一次运行并执行操作。
@Override
protected void onResume() {
super.onResume();
if(!mFirstRun){
mFirstRun=true;
}else {
FragmentManager manager = getSupportFragmentManager();
manager.popBackStack();
mFirstRun=false;
}
}
当在第二个活动中触发事件时,不要忘记在第二个活动中呼叫finish()
,这将再次恢复第一个活动。