正确的移除DialogFragment的方式:dismiss()还是transaction.remove()?

5
我仍然因在我的主活动上使用了一个 DialogFragment 而遇到问题。
我目前正在使用以下代码来移除它:
FragmentTransaction transaction = getFragmentManager().beginTransaction();
Fragment frag = getFragmentManager().findFragmentByTag("LockDialog");

if(frag != null) {
    transaction.remove(frag);
    transaction.commit();
}

问题在于,由于对话框未被正确移除,有时会出现重复的对话框导致崩溃。
所以我的问题是:是否正确的方法是移除 DialogFragment 或者它只能用于 Fragments
我是否必须始终使用 dismiss() 方法?
Fragment lockFragment = getFragmentManager().findFragmentByTag("LockDialog");

//If the dialog already exist, we dismiss it
if(lockFragment != null  && lockFragment instanceof LockDialogFragment) {
    LockDialogFragment lockDialog = (LockDialogFragment) lockFragment;
    lockDialog.dismiss();
}

这是我目前在一个应用程序中遇到的最大bug,所以在选择其中一个之前我想要确定。

谢谢!

编辑:我刚意识到我的当前问题可能是由于提交可以被延迟导致的,我将添加executePendingTransactions来查看是否有任何改善。 但仍然有另一个问题,如果对话框已被关闭,是否需要调用transaction.remove()?使用dismiss()比使用事务更直观和安全吗?


1
给那个踩我问题的人,请至少解释一下,我不知道我的问题是那么明显的... - Yoann Hercouet
2个回答

5

DialogFragment.dismiss() 是正确的方式。根据 文档

关闭 fragment 和它的对话框。如果该 fragment 被添加到了后退栈中,那么所有后退栈状态都将被弹出,包括此条目在内。否则,将提交一个新事务以删除该 fragment。


谢谢你的回答。关于 dismiss(),我们确定对话框的删除总是立即完成了吗?在我的代码中,在调用 super.onSaveInstanceState(savedInstanceState) 之前,我必须先移除我的 DialogFragment。我想要百分之百确定这个对话框不会被保留在实例中。 - Yoann Hercouet
不确定,但我猜应该不会。你可以随时使用dismissAllowingStateLoss() - matiash
好的,我现在会接受你的答案并尝试仅使用 dismiss()。如果问题仍未解决,我稍后会更新问题。 - Yoann Hercouet

0

显示对话框片段:dialogFragment.show(transition,FocusDialogFragment.TAG);

关闭对话框片段:dialogFragment.dismiss();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接