gpt4 book ai didi

android - 从 Backstack 添加 fragment 时出现 IllegalStateException

转载 作者:搜寻专家 更新时间:2023-11-01 09:19:59 27 4
gpt4 key购买 nike

有时我会收到以下崩溃报告:

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);

所以它说已经添加了一些 fragment 。不幸的是,Google 不再在 Google Play 控制台中显示消息(已经添加了哪个 fragment )。据我对 Stacktrace 的了解,当从后台添加 fragment 时会发生此异常吗?

我有一个 FrameLayout,我在其中添加/删除 fragment 。我总是使用以下代码添加它们:

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 和所有类型设备的报告,我不知道它会在哪里发生。

可能是带有动画或慢速设备的东西?因为它只是偶尔发生。

最佳答案

请注意,您正在添加和删除两个具有相同标签的不同 fragment ——标签也应该不同。如果 prev fragment 是另一个类的实例,为什么要使用 fragment 的类名作为标签来查找它?

您应该添加一个if 语句来检查prevfragment 有时是否不是同一实例(因为相同的标签)。

如果这两个 fragment 是同一个实例,而您仍然想删除然后添加相同的 fragment ——您可能必须在两个不同的事务中执行此操作,以防止出现“Fragment already added”异常.

关于android - 从 Backstack 添加 fragment 时出现 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56973487/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com