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

Удаление фрагментов из активности

FragmantClass rSum = new FragmantClass();
getSupportFragmentManager().beginTransaction().remove(rSum).commit();       

Я пытаюсь удалить этот фрагмент, когда я загружаю другой фрагмент. Вышеприведенный фрагмент не удаляется. Вот метод, который я вызываю для переключения фрагментов.

public void switchContent(Fragment fragment) {
    FragmantClass rSum = new FragmantClass();
    getSupportFragmentManager().beginTransaction().remove(rSum).commit();
    mContent = fragment;
    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.content_frame, fragment)
        .commit();
    getSlidingMenu().showContent();
}
4b9b3361

Ответ 1

getSupportFragmentManager().beginTransaction().
remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit();

Попробуйте это, он должен работать.

public void switchContent(Fragment fragment) {
    getSupportFragmentManager().beginTransaction().
    remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit();
    mContent = fragment;
    getSupportFragmentManager()
        .beginTransaction()
        .replace(R.id.content_frame, fragment)
        .commit();
    getSlidingMenu().showContent();
}

Ответ 2

В моем личном случае я добавляю и удаляю фрагмент следующим образом:

 if(getSupportFragmentManager().findFragmentById(R.id.container) != null) {
        getSupportFragmentManager()
                .beginTransaction().
                remove(getSupportFragmentManager().findFragmentById(R.id.container)).commit();
    }
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.container, fragment)
            .commit();

Всегда хорошо проверять, имеет ли ваш контейнер фрагмент или будет иметь исключение null

Ответ 3

Это очень простое решение для SupportFragmentManager. FragmentManager не совсем удобен, но эффективен:

List<Fragment> fragmentList = getSupportFragmentManager().getFragments();
// You might have to access all the fragments by their tag,
// in which case just follow the line below to remove the fragment
if (fragmentList == null) {
    // code that handles no existing fragments
}

for (Fragment frag : fragmentList )
{
   // To save any of the fragments, add this check
   // a tag can be added as a third parameter to the fragment when you commit it
   if (frag.getTag().equals("<tag-name")) {
      continue;
   }

   getSupportFragmentManager().beginTransaction().remove(frag).commit();
}

или, если вы вынуждены использовать его (но не рекомендуется):

.commitAllowingStateLoss();

Если вы удаляете все фрагменты из представления несколько раз, вы можете проверить, является ли текущий фрагмент нулевым или isDetached() или isRemoving(), или вы можете получить NullPointerExceptions.

Обновление 6-9-15: Документация для getSupportFragmentManger().getFragments() теперь, по-видимому, скрыта, но все же отлично работает в моем коде. Вот скриншот документации:

enter image description here

Обновление 8-3-15. Если вы не используете библиотеку поддержки для фрагментов, к сожалению, нет getFragments(), но есть еще пара, более неудобные варианты.

  • Дайте каждому fragment a tag или id при создании и проведите через них, чтобы обработать каждый fragment по желанию.
  • Создайте прослушиватель с помощью onAttachListener, поэтому каждый раз, когда к activity присоединяется новый fragment, вы можете сохранить это fragment, а затем перебирать эту структуру данных для обработки каждого fragment по желанию.

Если вы не используете getSupportFragmentManager(), для обработки транзакции вам нужно будет использовать getFragmentManager().