Подтвердить что ты не робот

Фрагмент уже добавлен. Поддержка lib

Так как я обновил свое приложение, чтобы использовать поддержку lib rev. 11 и скомпилирован против SDK 4.2. Я получаю следующую ошибку:

java.lang.IllegalStateException: Fragment already added: i{4079e598 #2 id=0x1020002 i}
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1159)
    at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:729)
    at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1493)
    at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:477)
    at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:174)

Я прочитал о подобных проблемах в stackoverflow. Некоторые из них предлагают избежать метода замены, который я не использую. Транзакция, которая вызывает сбой при откате, выглядит следующим образом:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit()

Другие комментарии говорят, что это может произойти, если вы используете переходы фрагментов, которые не могут закончить достаточно быстро, прежде чем пользователь снова вернется. Поскольку я использую переходные анимации на данных фрагментах, это может быть причиной. Однако удаление перехода не является выбором, и поскольку этот исключительно встречается на телефонах под управлением 2.3.x, и ошибка была введена путем обновления до lib 11 и sdk 4.2. Надеюсь, что Google исправит ее со следующей версией.

Есть ли похожие проблемы, информация о том, планируется ли это исправление в 4.2.1 или поддержка r12, или предложения о том, что я могу сделать, чтобы избежать ошибки?

4b9b3361

Ответ 1

Я пытаюсь исправить проблему, используя подсказку, которую я нашел здесь

Итак, я добавил executePendingTransactions() для немедленного выполнения транзакции:

ft.remove(oldFrag).add(newFrag).addToBackStack(null).commit()
getFragmentManager().executePendingTransactions();

Это должно гарантировать, что backstack всегда находится в чистом состоянии, я надеюсь, и у меня нет никаких отрицательных недостатков, о которых я могу думать.

Обновление Несмотря на то, что он работает на обычных телефонах, проблема остается на некоторых универсальных устройствах, которые не имеют известного номера версии Android, например 4.0.1 или аналогичного, но вместо этого сообщают о некоторых датах, таких как "Thu Mar 02 2006 00:00:00 GMT + 0100 (MEZ)" в качестве номера версии Android, например: samsung - espressowifixx - GT-P3110 сообщает данную дату как версию для Android и дает исключение, добавленное фрагментом... Все еще раздражает. Пользователи не заботятся об этом, поэтому всегда обвиняют уже недостающего разработчика. Конечно, нет проблем для компаний с миллиардным доходом, но отдельные разработчики просто делают что-то более полезное с вашим временем, чем писать приложения;)

Ответ 2

Итак, для меня оказалось, что я на самом деле пытался добавить фрагмент дважды. Возможно, в предыдущих версиях поддерживающих библиотек он просто проглотил это и двинулся дальше. К сожалению, даже проверка того, что фрагмент isAdded() не работает для меня, потому что в моем случае я вызывал их назад, прежде чем транзакция успела фактически добавить первый фрагмент.

То, что я закончил, это создать переменную класса boolean fragmentAdded и установить ее в true сразу после совершения транзакции. Затем я проверяю это логическое значение, прежде чем пытаться добавить фрагмент. Возможно, это не решение вашей проблемы, но для меня это было так, надеюсь, это поможет.