Время от времени я получаю следующий отчет о сбое:
java.lang.IllegalStateException:
at androidx.fragment.app.FragmentManagerImpl.addFragment (FragmentManagerImpl.java:1916)
at androidx.fragment.app.BackStackRecord.executePopOps (BackStackRecord.java:828)
at androidx.fragment.app.FragmentManagerImpl.executeOps (FragmentManagerImpl.java:2622)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether (FragmentManagerImpl.java:2411)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManagerImpl.java:2366)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions (FragmentManagerImpl.java:2273)
at androidx.fragment.app.FragmentManagerImpl$1.run (FragmentManagerImpl.java:733)
at android.os.Handler.handleCallback (Handler.java:808)
at android.os.Handler.dispatchMessage (Handler.java:101)
at android.os.Looper.loop (Looper.java:166)
at android.app.ActivityThread.main (ActivityThread.java:7529)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)
В строке 1916 FragmentManagerImpl я могу найти:
throw new IllegalStateException("Fragment already added: " + fragment);
Таким образом, он говорит, что какой-то фрагмент уже добавлен,К сожалению, Google больше не показывает сообщение (какой фрагмент уже был добавлен) в консоли Google Play.Насколько я понимаю, Stacktrace это исключение возникает при добавлении фрагмента из backstack, верно?
У меня есть один FrameLayout
, в который я добавляю / удаляю фрагменты.Я всегда добавляю их со следующим кодом:
public void addFragment(FragmentActivity activity, Fragment fragment) {
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
String tag = fragment.getClass().getCanonicalName();
Fragment prev = activity.getSupportFragmentManager().findFragmentByTag(tag);
if (fragment.isAdded()) {
return;
}
if (prev != null) {
transaction.remove(prev);
}
transaction.replace(R.id.fragment_container, fragment, tag);
transaction.addToBackStack(null);
transaction.commit();
И добавляю DialogFragments следующим методом:
public void openFragmentDialog(FragmentActivity activity, DialogFragment dialogFragment, String tag) {
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
Fragment prev = activity.getSupportFragmentManager().findFragmentByTag(tag);
if (prev != null) {
transaction.remove(prev);
}
transaction.addToBackStack(null);
dialogFragment.show(transaction, tag);
}
В какой ситуации может произойти исключение IllegalStateException?Я добавляю / заменяю Fragments / DialogFragments неправильным способом?Я никогда не мог воспроизвести эту ошибку.Но я получаю отчеты от Android 4.4 - Android 9 и всех типов устройств, и я не знаю, где это может произойти.
Может ли это быть что-то с анимацией или медленными устройствами?Потому что это случается только изредка.