如何用另一个DialogFragment替换DialogFragment?

时间:2016-03-30 10:04:04

标签: android android-fragments android-fragmentactivity android-dialogfragment

我们以编程方式添加一般/普通Fragment

fragmentTransaction.add(containerViewId, fragmentToAdd, fragmentTag);

我们通过执行以下操作替换一个Fragment

fragmentTransaction.replace(containerViewId, newFragment, tagOfNewFragment);

但我们添加了 DialogFragment

dialogFramentInstance.show(fragmentManager, fragmentTag);

问题是我应该如何替换 DialogFragment方法添加的show()

4 个答案:

答案 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),因为它们没有相同的堆栈,则您将无法访问原始对话框片段并将其删除。