【发布时间】:2019-07-10 14:57:45
【问题描述】:
我有时会收到以下崩溃报告:
java.lang.IllegalStateException:
at androidx.fragment.app.FragmentManagerImpl.addFragment (FragmentManagerImpl.java:1916)
at androidx.fragment.app.BackStackRecord.executePopOps (BackStackRecord.java:828)
at androidx.fragment.app.FragmentManagerImpl.executeOps (FragmentManagerImpl.java:2622)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether (FragmentManagerImpl.java:2411)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManagerImpl.java:2366)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions (FragmentManagerImpl.java:2273)
at androidx.fragment.app.FragmentManagerImpl$1.run (FragmentManagerImpl.java:733)
at android.os.Handler.handleCallback (Handler.java:808)
at android.os.Handler.dispatchMessage (Handler.java:101)
at android.os.Looper.loop (Looper.java:166)
at android.app.ActivityThread.main (ActivityThread.java:7529)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
在 FragmentManagerImpl 的第 1916 行我可以找到:
throw new IllegalStateException("Fragment already added: " + fragment);
所以它说已经添加了一些片段。不幸的是,谷歌不再在谷歌播放控制台中显示消息(已经添加了哪个片段)。据我了解 Stacktrace 从后台堆栈添加片段时会发生此异常吗?
我有一个FrameLayout,我在其中添加/删除片段。我总是用以下代码添加它们:
public void addFragment(FragmentActivity activity, Fragment fragment) {
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
String tag = fragment.getClass().getCanonicalName();
Fragment prev = activity.getSupportFragmentManager().findFragmentByTag(tag);
if (fragment.isAdded()) {
return;
}
if (prev != null) {
transaction.remove(prev);
}
transaction.replace(R.id.fragment_container, fragment, tag);
transaction.addToBackStack(null);
transaction.commit();
我使用以下方法添加 DialogFragments:
public void openFragmentDialog(FragmentActivity activity, DialogFragment dialogFragment, String tag) {
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
Fragment prev = activity.getSupportFragmentManager().findFragmentByTag(tag);
if (prev != null) {
transaction.remove(prev);
}
transaction.addToBackStack(null);
dialogFragment.show(transaction, tag);
}
IllegalStateException 会在什么情况下发生?我是否以错误的方式添加/替换 Fragments/DialogFragments?我永远无法重现该错误。但我收到了来自 Android 4.4 - Android 9 和所有类型设备的报告,但我不知道它会发生在哪里。
可能是带有动画或慢速设备的东西吗?因为它只是偶尔发生。
【问题讨论】:
-
我仍然不能很好地理解片段来回答你的问题,但我有类似的问题可能对你有帮助:stackoverflow.com/q/30627498/4107809stackoverflow.com/q/30671291/4107809我的部分困惑是替换和部分片段的多个副本。
标签: android android-fragments android-dialogfragment illegalstateexception fragment-backstack