我们以编程方式添加一般/普通Fragment
:
fragmentTransaction.add(containerViewId, fragmentToAdd, fragmentTag);
我们通过执行以下操作替换一个Fragment
:
fragmentTransaction.replace(containerViewId, newFragment, tagOfNewFragment);
但我们添加了 DialogFragment
dialogFramentInstance.show(fragmentManager, fragmentTag);
问题是我应该如何替换 DialogFragment
方法添加的show()
?
答案 0 :(得分:1)
dialogFramentInstance.show(fragmentManager, fragmentTag);
只需使用添加事务(没有容器)将对话框片段添加到片段管理器。
为了替换片段,您需要一个容器,因为您没有容器,您唯一的选择是dismiss()
第一个容器和show()
新容器。< / p>
答案 1 :(得分:1)
private void closeYourDialogFragment() {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragmentToRemove = getSupportFragmentManager().findFragmentByTag("your_dialog_fragment");
if (fragmentToRemove != null) {
ft.remove(fragmentToRemove);
}
ft.addToBackStack(null);
ft.commit(); // or ft.commitAllowingStateLoss()
}
private void replaceYourDialogFragment() {
closeYourDialogFragment();
YourDialogFragment yourDialogFragment = new YourDialogFragment();
yourDialogFragment.show(getSupportFragmentManager(), "your_dialog_fragment");
}
答案 2 :(得分:0)
也许你可以这样做:
public void showFragment(Fragment fragment) {
if (fragment instanceof DialogFragment) {
FragmentTransaction ft = mContext.getFragmentManager().beginTransaction();
Fragment prev = mContext.getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
Log.d(TAG, "showFragment: remove prev...." + prev.getClass().getSimpleName());
ft.remove(prev);
}
mContext.getFragmentManager().executePendingTransactions();
if (!fragment.isAdded()){
ft.addToBackStack(null);
((DialogFragment) fragment).show(ft, "dialog");
} else {
Log.w(TAG, "showFragment: fragment has been added!" );
}
}
}
答案 3 :(得分:-1)
所以这花了我很多时间去弄清楚。
对话框片段show方法仅添加片段,因此,如果要替换它们,则必须手动删除先前的对话框片段。
要记住的一件事,重要的是使用用于打开初始对话框片段的相同fragmentManager。例如,如果您通过活动(supportFragmentManager)打开了第一个对话框片段,并且现在使用对话框片段片段管理器(childFragmentManager),因为它们没有相同的堆栈,则您将无法访问原始对话框片段并将其删除。