【问题标题】:Custom DialogFragment (extends BottomSheetDialogFragment), java.lang.IllegalStateException: Fragment already added自定义DialogFragment(扩展BottomSheetDialogFragment),java.lang.IllegalStateException:Fragment已经添加
【发布时间】:2022-01-25 15:18:38
【问题描述】:

我有一个自定义 DialogFragment,得到java.lang.IllegalStateException:已添加片段.首先,当我快速单击按钮以显示 DialogFragment 时,我遇到了同样的崩溃。然后我覆盖 show()在显示之前删除片段.它在我的手机上看起来不错。但是在crashlytics上还是可以看到的,我之前的方法无法在手机上重现。

    @Override
    public void show(@NonNull FragmentManager manager, String tag) {
        try {
            manager.beginTransaction().remove(this).commitNowAllowingStateLoss();
            super.show(manager, tag);
        } catch (Exception ignored) {

        }
    }

    @Override
    public void dismiss() {
        if (getFragmentManager() != null) {
            super.dismiss();
        }
    }

这是我的 DialogFragment 的代码。我有一个外部按钮的生成器来显示它

public class BMBottomSheetDialogFragment extends BottomSheetDialogFragment {
    private static BMBottomSheetDialogFragment fragment;
    public static BMBottomSheetDialogFragment newInstance(Builder builder) {
        if (fragment == null) {
            fragment = new BMBottomSheetDialogFragment();
        }
        final Bundle args = new Bundle();
        ...

        fragment.setArguments(args);
        return fragment;
    }

    public static class Builder {
        public BMBottomSheetDialogFragment build() {
            return newInstance(this);
        }
        public void show(FragmentManager fragmentManager, String tag) {
            BMBottomSheetDialogFragment dialog = build();
            dialog.show(fragmentManager, tag);
        }
    }
}

那么,为什么覆盖show()没有意义以及如何修复此崩溃?

  • 不要保留对BMBottomSheetDialogFragment 的静态引用,这会导致泄漏。只需以常规方式打开BMBottomSheetDialogFragment。如果你想防止打开多个 Dialogs 。您可以在 Click 事件上设置一个阈值。 Like this。此外,您不需要Builder。把事情简单化

标签: java android android-dialogfragment dialogfragment bottomsheetdialogfragment


【解决方案1】:

而不是使用commitNowAllowingStateLoss利用犯罪在显示方法中。

【讨论】:

  • 你能解释一下原因吗?
  • 当我们在关闭之前尝试添加相同的片段或 DialogFragment 两次时会发生这种情况,我认为阅读 this 链接可能会对您有所帮助,
  • 我知道崩溃的原因,但我很困惑为什么即使使用manager.beginTransaction().remove(this).commitNowAllowingStateLoss(); 应该在添加之前删除片段,也会导致这次崩溃。
  • 也许没有片段可以删除
  • 我想到了导致崩溃的一种情况:remove.commitNowAllowingStateLoss 在前一个 add.commit 之前立即执行,所以它实际上并没有删除前一个片段。
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
相关资源
最近更新 更多