Android 已添加片段,dialogfragment?

Android 已添加片段,dialogfragment?,android,android-fragments,android-dialogfragment,illegalstateexception,fragmentmanager,Android,Android Fragments,Android Dialogfragment,Illegalstateexception,Fragmentmanager,我有一个dialogfragment,它显示得很好,但是当我试图显示它时,我总是得到IllegalStateException 下面是日志 java.lang.IllegalStateException: Fragment already added: SelectPlan04Dialog{fa768dc #7 } at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1893)

我有一个dialogfragment,它显示得很好,但是当我试图显示它时,我总是得到
IllegalStateException

下面是日志

java.lang.IllegalStateException: Fragment already added: SelectPlan04Dialog{fa768dc #7 }
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1893)
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:760)
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2595)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2382)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2337)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2244)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:702)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:192)
    at android.app.ActivityThread.main(ActivityThread.java:6679)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)]
这是我如何调用对话框的代码

if (selectPlan04Dialog == null) {
    selectPlan04Dialog = new SelectPlan04Dialog();
}
if (!selectPlan04Dialog.isVisible() && !selectPlan04Dialog.isAdded()) {
    Bundle b = new Bundle();
    b.putSerializable("moduleApi", module);
    selectPlan04Dialog.setArguments(b);                
    selectPlan04Dialog.show(getCurrentActivity().getSupportFragmentManager(), "");
}

片段事务是异步的

在执行片段事务之前,可能有两个或多个对此代码的调用<代码>!选择Plan04Dialog.isVisible()&!选择Plan04Dialog.isAdded()条件为true,并且
show()
安排另一个片段事务稍后执行

解决此问题的一些选项:

  • 每次都创建一个新对话框,不要尝试重用旧对话框
  • 通过调用片段管理器将异步片段事务更改为同步
    executePendingTransactions()

在我的解决方案中,我尝试多次快速点击按钮来显示对话框片段

        try{
            FragmentManager fm = getSupportFragmentManager();
            Fragment oldFragment = fm.findFragmentByTag("wait_modal");

            if(oldFragment != null && oldFragment.isAdded())
                return;

            if(oldFragment == null && !please_wait_modal.isAdded() && !please_wait_modal.isVisible()){
                fm.executePendingTransactions();
                please_wait_modal.show(fm,"wait_modal");
            }
        }catch (Exception e){
            e.printStackTrace();
        }

但是调用executePendingTransactions可以吗?我正在经历ANR,因为要显示的电话太多了