Фрагмент уже добавлен, диалогфрагмент? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть диалоговое окно, которое отображается нормально, но когда я пытаюсь отобразить его, я получаю IllegalStateException

Ниже находится logcat

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(), "");
}

1 Ответ

2 голосов
/ 10 апреля 2019

Фрагмент транзакций асинхронный.

Возможно, у вас есть два или более вызовов этого кода перед выполнением транзакций фрагмента. !selectPlan04Dialog.isVisible() & !selectPlan04Dialog.isAdded() условие истинно и show() планирует другую транзакцию фрагмента для выполнения позже.

Некоторые варианты исправления:

  • Каждый раз создавайте новый диалог и не пытайтесь повторно использовать старый
  • Изменение асинхронных транзакций фрагментов на синхронные с вызовом диспетчера фрагментов executePendingTransactions()
...