【问题标题】:DialogFragment not found in fragmentTransaction在 fragmentTransaction 中找不到 DialogFragment
【发布时间】:2019-07-18 08:05:58
【问题描述】:

我正在显示来自经理的 DialogFragment。 DialogFragment 显示多次。

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

@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 但它始终为空。我不想显示已经显示的片段。否则它重复。多个对话框片段打开

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

找到编辑解决方案

感谢您的帮助。问题解决了,我在下面发布了答案

【问题讨论】:

    标签: android-fragments android-dialogfragment fragmenttransaction fragment-backstack


    【解决方案1】:

    如果您的问题与另一个 DialogFragment 相同,您可以尝试将变量添加到您的 Manager:

    @Nullable
    private DialogFragment mCurrentDialogFrag;
    

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

    【讨论】:

      【解决方案2】:

      我终于能够通过重写 show 方法来处理它 和addToBackStack(null)executePendingTransactions

      首先将标签放入findFragmentByTag addToBackStack 是必须的,否则标签不会添加到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);
              }
          }
      

      现在如果片段已经在事务中。它不会再次显示..

      【讨论】:

        【解决方案3】:

        如果我查看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 的覆盖范围内。

        【讨论】:

          猜你喜欢
          • 2012-06-14
          • 1970-01-01
          • 1970-01-01
          • 2015-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多