Фрагмент уже добавлен IllegalStateException

Я использую этот метод в своем контейнере Activity, чтобы показать 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 () из той же Activity:

  • и он переходит в выражение else. (так что я могу вывести, что mBFrag НЕ ДОБАВЛЕН)
  • но у меня есть fragment, уже добавленный IllegalStateException … (так почему он не попал в инструкцию if?)

Так:

  1. Почему метод isAdded () не возвращает TRUE, если я получаю fragment, уже добавленный IllegalStateException ??
  2. Операция popBackStack полностью удаляет ранее добавленные fragmentы?
  3. Какое поведение я недопонимаю?

EDIT: Вот полная информация об исключении.

 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);" 

    Наконец, моим обходным решением было выполнить remove () предыдущего fragmentа и добавить () новый. Хотя это метод replace () предназначался для …

    Но я догадываюсь, почему метод replace () не работал нормально в этом случае … действительно странно, и я хочу отказаться от этого, потому что я что-то не понимаю или что-то не так.

    Если состояние активности уже сохранено, более безопасно не вызывать фиксацию. commitAllowingStateLoss() этого вы должны вызвать commitAllowingStateLoss() . Надеюсь это поможет!

    Edit: ok Я внимательно рассмотрел вашу проблему, проблема заключается в том, что вы пытаетесь добавить fragment, который уже был добавлен. Даже если вы используете замену или удаление вызовов, вы не можете этого сделать. Только работа, которую я нашел, – это создать новый экземпляр fragmentа и добавить его каждый раз. После удаления или замены fragmentа лучше всего отбросить все ссылки на него, чтобы GC мог позаботиться об этом.

    Вероятно, не связанный с этой проблемой напрямую, но я также заметил, что установка перехода к FragmentTransaction вызовет исключение IllegalStateException, в то время как не устанавливать переход не будет.

    Вот ошибка для этой проблемы: http://code.google.com/p/android/issues/detail?id=25598

    Проверьте, добавлен ли frament или нет с помощью метода fragment.isAdded (). Замените или добавьте fragment соответственно

    попробуйте это после fragmentаTransection.replace ()

     fragmentTransection.addToBackStack(null); fragmentTransection.commitAllowingStateLoss(); 

    Я использовал это:

     if (getFragmentManager().findFragmentByTag(newFragment.getClass().getName()) != null) { transaction.remove(newFragment); } 

    и добавленный fragment с

     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(); 

    Решила его, перебирая мои fragmentы и проверяя, является ли isAdded () истинным, а затем удаляет этот fragment. Подробнее здесь.

    Удаление setOffscreenPageLimit из Viewpager решило мою проблему. Благодарю.

    if (mFragment.isAdded ()) {return; // или возвращаем false / true, исходя из того, откуда вы вызываете}

    Давайте будем гением компьютера.