我从我的应用程序中获取用户报告,提供以下异常:
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1109)
at android.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:399)
at android.app.Activity.onBackPressed(Activity.java:2066)
at android.app.Activity.onKeyUp(Activity.java:2044)
at android.view.KeyEvent.dispatch(KeyEvent.java:2529)
at android.app.Activity.dispatchKeyEvent(Activity.java:2274)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.widget.TabHost.dispatchKeyEvent(TabHost.java:297)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1112)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1855)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1277)
at android.app.Activity.dispatchKeyEvent(Activity.java:2269)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1803)
at android.view.ViewRoot.deliverKeyEventPostIme(ViewRoot.java:2880)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2853)
at android.view.ViewRoot.handleMessage(ViewRoot.java:2028)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:132)
at android.app.ActivityThread.main(ActivityThread.java:4028)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:491)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844) …Run Code Online (Sandbox Code Playgroud) android illegalstateexception android-fragments android-viewpager fragmenttransaction
在Android N和支持库版本24中添加的新commitNow()方法具有有限且有点令人困惑的文档.
同步提交此事务.任何添加的片段都将被初始化并完全进入其主机的生命周期状态,并且在此调用返回之前,所有已删除的片段将相应地被拆除.以这种方式提交事务允许将片段添加为专用的封装组件,这些组件监视其主机的生命周期状态,同时提供更完整的排序保证,以确保这些片段何时完全初始化并准备就绪.管理视图的片段将创建和附加这些视图.
调用commitNow比调用commit()后跟FragmentManager.executePendingTransactions()更好,因为后者的副作用是尝试提交所有当前挂起的事务,无论这是否是所需的行为.
以这种方式提交的事务可能不会被添加到FragmentManager的后台堆栈中,因为这样做会破坏其他异步提交事务的其他预期排序保证.如果先前请求使用addToBackStack(String)将事务添加到后台堆栈,则此方法将抛出IllegalStateException.
事务只能在其包含活动保存其状态之前使用此方法提交.如果在该点之后尝试提交,则将引发异常.这是因为如果活动需要从其状态恢复,则提交后的状态可能会丢失.请参阅commitAllowingStateLoss()以了解可能丢失提交的情况.
我用粗体突出显示了我认为令人困惑的部分.
所以,我的主要关注点/问题是:
1 - 他们可能不会被添加?它说我会得到一个IllegalStateException,它会被添加还是不被添加?
2 - 如果我们想在backstack中添加片段,我接受这样的事实:我不能使用它.它没有说的是你得到这个例外:
java.lang.IllegalStateException: This transaction is already being added to the back stack
Run Code Online (Sandbox Code Playgroud)
???? !!!!
所以我不能打电话给addToBackStack(String)自己,因为它在内部为我打电话?对不起但是......什么?为什么?如果我不希望它被添加到Backstack中怎么办?如果我稍后尝试从后台堆栈中使用该片段但是因为它可能不会被添加,以后它不存在呢?
看起来这是我期待的东西commitAllowingStateLoss(),但是我看到它commitNowAllowingStateLoss()也存在,所以...它遵循什么样的逻辑?
TL; DR
commitNow()内部如何处理backstack?
您好我fragment在我的Android应用程序中使用但是我发现java.lang.IllegalStateException: Fragment already added如果应用程序在后台非常长时会出现一些奇怪的异常.
我查了一下这个https://code.google.com/p/android/issues/detail?id=61247,java.lang.IllegalStateException:已添加的片段,但如何我可以检查分片是否已添加的情况下,当我添加在fragment中FragmentTabHost
源代码 :
public class FirstFragment extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mTabHost = new FragmentTabHost(getSherlockActivity());
mTabHost.setup(getSherlockActivity(), getChildFragmentManager(),
R.layout.registration);
// Create Child Tab1
mTabHost.addTab(mTabHost.newTabSpec("child1").setIndicator("Registration"),
RegistrationFragment.class, null);
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
java.lang.IllegalStateException: Fragment already added: RegistrationFragment{424d19f8 #0 id=0x7f0600b8 child1 }
at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1175)
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:616)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:556)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)
at android.app.Activity.performStart(Activity.java:5143)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
at android.app.ActivityThread.access$600(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) …Run Code Online (Sandbox Code Playgroud)