Фрагмент уже добавлен 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 вместо этого?)

Так:

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

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

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() истинным, а затем удаляя этот фрагмент. подробнее здесь.


удаление setOffscreenPageLimit с Viewpager решить мою проблему. Спасибо.


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