Фрагмент уже добавлен IllegalStateException
Я использую этот метод в своей активности контейнера, чтобы показать BFrag
public void showBFrag()
{
// Start a new FragmentTransaction
FragmentTransaction fragmentTransaction = mFragmentMgr.beginTransaction();
if(mBFrag.isAdded())
{
Log.d(LOG_TAG, "Show() BFrag");
fragmentTransaction.show(mBFrag);
}
else
{
Log.d(LOG_TAG, "Replacing AFrag -> BFrag");
fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag);
}
// Keep the transaction in the back stack so it will be reversed when backbutton is pressed
fragmentTransaction.addToBackStack(null);
// Commit transaction
fragmentTransaction.commit();
}
Я вызываю его из моей активности контейнера; в первый раз:
- попадает в оператор else и mBFrag заменяет mAFrag.
затем я нажимаю кнопку "Назад":
- и операция отменяется (mAFrag показан, но.. удаляется ли mBFrag?).
затем я снова иду вперед, вызывая showBFrag() из того же действия:
- и он снова попадает в оператор else. (поэтому я могу сделать вывод, что mBFrag не добавлен)
- а у меня фрагмент уже добавлен IllegalStateException... (так почему же он не попал в Оператор if вместо этого?)
Так:
- почему метод isAdded () не возвращает TRUE, если я получаю фрагмент уже добавлен IllegalStateException??
- работает ли popBackStack полностью удалить ранее добавленные фрагменты?
- какое поведение я неправильно?
изменить: Вот полная информация об исключении.
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): java.lang.IllegalStateException: Fragment already added: BFrag{40b28158 id=0x7f0c0085}
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at android.app.BackStackRecord.doAddOp(BackStackRecord.java:322)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at android.app.BackStackRecord.replace(BackStackRecord.java:360)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at android.app.BackStackRecord.replace(BackStackRecord.java:352)
06-07 12:08:32.730: ERROR/AndroidRuntime(8576): at myPackageName.containerActivity.showBFrag() // This line: "fragmentTransaction.replace(R.id.operation_fragments_frame, mBFrag);"
11 ответов
наконец, моим обходным путем было выполнить remove() предыдущего фрагмента и добавить () новый. Хотя это то, что replace () method должен был сделать...
но я все еще догадываюсь, почему метод replace () не работал нормально в этом случае... это действительно странно, и я хочу отбросить это, потому что я что-то неправильно понимаю или делаю что-то неправильно.
Если состояние действия уже сохранено, его больше не безопасно вызывать commit. Вы должны позвонить . Надеюсь, это поможет!
Edit: ok Я более подробно рассмотрел вашу проблему, проблема в том, что вы пытаетесь добавить фрагмент, который уже был добавлен. Даже если вы используете replace или remove calls, вы не можете этого сделать. Только обойти я нашел, это создать новый экземпляр фрагмента и добавлять его каждый раз. Как только вы удалите или замените фрагмент лучше отказаться все ваши ссылки на него, чтобы GC мог позаботиться об этом.
вероятно, не связано с этой проблемой напрямую, но я также заметил, что установка перехода на FragmentTransaction вызовет исключение IllegalStateException, а не установка перехода не будет.
вот ошибка для этой проблемы:http://code.google.com/p/android/issues/detail?id=25598
Проверьте, добавлен ли фрагмент уже или не используется фрагмент метода.isAdded () замените или добавьте фрагмент соответственно
попробуйте это после fragmentTransection.replace ()
fragmentTransection.addToBackStack(null);
fragmentTransection.commitAllowingStateLoss();
я использовал этот:
if (getFragmentManager().findFragmentByTag(newFragment.getClass().getName()) != null) {
transaction.remove(newFragment);
}
и добавлен фрагмент с
MyFragment frag = new MyFragment();
transaction.add(R.id.container, frag, MyFragment.class.getName())
MyFragment.class.getName()
расшифровывается как tag
Я пытался позвонить FragmentTransaction.remove()
С onTabUnselected()
и это сработало вокруг этой ошибки.
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft.add(R.id.fragment_container, fragment, null);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.remove(fragment);
}
этот код отлично работает для меня. попробуйте это
((MiActivity)getActivity()).addAccount = new AddAccount();
((MiActivity)getActivity()).addAccount.setArguments(params);
fragmentManager = getActivity().getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container((MiActivity)getActivity()).addAccount);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
решил его, прокручивая мои фрагменты и проверяя, является ли isadded() истинным, а затем удаляя этот фрагмент. подробнее здесь.
if(mFragment.isAdded()) { return; / / или return false / true, в зависимости от того, откуда вы звоните }