0

我有一个自定义 DialogFragment,得到了java.lang.IllegalStateException: Fragment already added。首先,当我快速单击按钮以显示 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()意义以及如何修复此崩溃?

4

1 回答 1

0

而不是使用commitNowAllowingStateLoss在 show 方法中使用commit 。

于 2022-01-25T07:18:38.307 回答