Фрагмент уже добавлен IllegalStateException - PullRequest
53 голосов
/ 06 июня 2011

Я использую этот метод в своем контейнере 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();        
}

Я вызываю его из моего контейнера Activity;в первый раз:

  • попадает в оператор else и mBFrag заменяет mAFrag.

Затем я нажимаю кнопку возврата:

  • , и операция переворачивается (отображается mAFrag, но .. mBFrag удален?).

Затем я снова иду вперед, вызывая showBFrag () из той же операции:

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

Итак:

  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 ]

0 голосов
/ 11 марта 2013

Я попытался позвонить 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);
}
...