【发布时间】:2017-12-12 13:24:01
【问题描述】:
我有以下情况
举个例子:
我有包含两个片段的 FirstActivity。默认情况下,Fragment-A 加载到 FirstActivity。通过单击 Fragment-A 屏幕中的按钮移动到 Fragment-B,它将添加到后堆栈。从 Fragment-B 有一个按钮,我从那里访问第二个活动。现在,如果发生任何事件,我将调用 FragmentManager.popBackStack 方法将 Fragment-B 移动到 Fragment-A(这是应用程序要求),当时我的应用程序崩溃了。因为我在 SecondActivity 和 FragmentManager.popBackStack 从 FirstActivity 调用。
现在是我的代码
从 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 的文档写道
此函数是异步的——它将要弹出的请求排入队列,但在应用程序返回其事件循环之前不会执行该操作。
所以根据文档,我认为它应该可以工作,但它给了我异常并且我的应用程序崩溃了。
我已经检查了此链接以解决我的问题,但没有得到任何解决方案
Is it safe to call FragmentManager.popBackStack when activity is paused
简而言之,我的问题是 Activity 暂停时如何调用 FragmentManager.popBackStack? (意味着当我在第二个活动和 FirstActivity 暂停)
【问题讨论】:
-
在事件发生时首先完成第二个活动,然后调用 FragmentManager.popBackStack 因为当第二个活动完成时,第一个活动 onresume 被调用。
-
@Anonymous 实际上的问题是我必须完成 secondactivity 并在我收到事件时同时调用 popbackstack ..所以它同时工作所以它会产生同样的问题......还有其他方式吗?
-
如果可能的话,您可以尝试创建一个新片段而不是第二个活动。这样可以轻松解决您的问题。
-
没有朋友,我真的需要第二个活动..这是很好的解决方案..但我不能使用它
-
请问您为什么需要第二个活动?
标签: android android-fragments onpause fragment-backstack