在 fragmentTransaction 中找不到 DialogFragment

DialogFragment not found in fragmentTransaction

I am displaying DialogFragment from a manager. DialogFragment display multiple times.

我想知道有没有办法从交易中检查这个片段是否已经显示。所以不要显示它。

@Override
public void show(FragmentManager manager, String tag) {
    try {
        FragmentTransaction ft = manager.beginTransaction();

        Fragment prev = manager.findFragmentByTag(tag);
        if (prev == null) {
            ft.add(this, tag);
            ///ft.addToBackStack(tag);
            ft.commitAllowingStateLoss();
        }

    } catch (IllegalStateException e) {
        Log.d("ABSDIALOGFRAG", "Exception", e);
    }
}

我这样称呼我的片段

CustomerFeedbackDialog feedbackDialog = CustomerFeedbackDialog.newInstance(genaric.getData(), type);

feedbackDialog.show(getSupportFragmentManager(), "feedbackDialog");

我调用了 findFragmentByTag,但它始终为空。我不想显示已经显示的片段。否则重复。多个 dialogFragment 打开

我知道我可以使用 sharedprefs 中的标志来做到这一点

找到编辑解决方案

Thanks for your help. Problem solved and I posted answer below

如果您的问题与另一个 DialogFragment 相同,您可以尝试向您的管理器添加一个变量:

@Nullable
private DialogFragment mCurrentDialogFrag;

然后每当您添加一个新的 DialogFragment 时,您将 mCurrentDialogFrag 设置为新的 DialogFragment,然后在添加之前检查当前的 DialogFragment 是否与新的相同。

我终于能够通过覆盖显示方法来处理它 和 addToBackStack(null)executePendingTransactions

Firstly to put tag in findFragmentByTag addToBackStack is must otherwise tag is not added in fragmentTransaction.

    @Override
    public void show(FragmentManager manager, String tag) {
        try {
            FragmentTransaction ft = manager.beginTransaction();

            Fragment prev = manager.findFragmentByTag(tag);
            if (prev == null) {
                ft.add(this, tag);
                ft.addToBackStack(null);
                ft.commitAllowingStateLoss();
                manager.executePendingTransactions();
            }

        } catch (IllegalStateException e) {
            Log.d("ABSDIALOGFRAG", "Exception", e);
        }
    }

现在如果片段已经在交易中。不会再显示了..

如果我查看 DialogFragmentpublic void show(FragmentManager manager, String tag) 方法实现,我可以看到:

    public void show(FragmentManager manager, String tag) {
        this.mDismissed = false;
        this.mShownByMe = true;
        FragmentTransaction ft = manager.beginTransaction();
        ft.add(this, tag);
        ft.commit();
    }

为了知道我的对话框已经是 FragmentManager 事务的一部分,我只是这样做:

        if (getFragmentManager().findFragmentByTag("...the tag") == null) {
            fragment.show(getFragmentManager(), "...the tag");
        }

我不得不提到以上是严格的 appcompat 经验,并且有效。显然,您也可以将此检查代码放在 show 的覆盖范围内。