在 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);
}
}
现在如果片段已经在交易中。不会再显示了..
如果我查看 DialogFragment
的 public 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
的覆盖范围内。
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);
}
}
现在如果片段已经在交易中。不会再显示了..
如果我查看 DialogFragment
的 public 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
的覆盖范围内。