【发布时间】: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