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

Есть ли способ удалить все фрагменты, которые уже добавили конкретное представление с его идентификатором представления?

Например, я хочу удалить все фрагменты, в которые добавлено представление R.id.fragmentcontainer.

Ответ 1

Это очень просто, просто перебрать все фрагменты и удалить его

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
    getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}

Но в случае с Navigation Drawer обязательно проверьте его, если вы попытаетесь удалить его, вы получите ошибку.

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
  if (fragment instanceof NavigationDrawerFragment) {
      continue;
  }
  else { 
      getSupportFragmentManager().beginTransaction().remove(fragment).commit();
  }
}

Последнее, но очень важное, обязательно проверяйте нулевое значение перед выполнением каких-либо операций с фрагментами

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
    if (fragment instanceof NavigationDrawerFragment) {
        continue;
    }
    else if (fragment != null) {
        getSupportFragmentManager().beginTransaction().remove(fragment).commit();
    }
}

Ответ 2

Вы можете попробовать под кодом

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

* frag - это фрагмент, который вы хотите удалить.

 OR
getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.your_container)).commit();

он удалит фрагмент, который закодирован в контейнере your_container.

HapPy кодирование.

Ответ 3

Это действительно очень просто.

private static void removeAllFragments(FragmentManager fragmentManager) {
    while (fragmentManager.getBackStackEntryCount() > 0) {
        fragmentManager.popBackStackImmediate();
    }
}

Ответ 4

Сохраните все ваши фрагменты в ArrayList.

Initializing:

List<Fragment> activeCenterFragments = new ArrayList<Fragment>();

Добавление фрагмента в список:

private void addCenterFragments(Fragment fragment) {
    fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.empty_center_layout, fragment);
    activeCenterFragments.add(fragment);
    fragmentTransaction.commit();
}

Если вы хотите удалить все, выполните следующие действия:

private void removeActiveCenterFragments() {
    if (activeCenterFragments.size() > 0) {
        fragmentTransaction = fragmentManager.beginTransaction();
        for (Fragment activeFragment : activeCenterFragments) {
            fragmentTransaction.remove(activeFragment);
        }
        activeCenterFragments.clear();
        fragmentTransaction.commit();
    }
}

Я использовал этот метод в производстве в течение многих лет, и он работает как шарм. Дайте мне знать, если у вас есть вопросы.

Ответ 5

Если кто-то ищет код в Котлине:

private fun clearFragmentsFromContainer() {
            val fragments = supportFragmentManager.fragments
            if (fragments != null) {
                for (fragment in fragments) {
                    supportFragmentManager.beginTransaction().remove(fragment).commit()
                }
            }
            //Remove all the previous fragments in back stack
            supportFragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
}

Ответ 6

Более оптимизированная версия
Нет необходимости в многократном вызове commit, поэтому давайте вызовем его один раз в конце

supportFragmentManager.fragments.let {
    if (it.isNotEmpty()) {
        supportFragmentManager.beginTransaction().apply {
            for (fragment in it) {
                remove(fragment)
            }
            commit()
        }
    }
}

Ответ 7

Попробуйте это, надеюсь, что это поможет: D

try {
if(manager.getFragments()!=null){
    if(manager.getBackStackEntryCount()>0) {
        for (int i = 0; i < manager.getBackStackEntryCount(); i++)
            manager.popBackStack();

        manager.beginTransaction().remove(getSupportFragmentManager()
        .findFragmentById(R.id.main_content))
        .commit();
        }
    }
}catch (Exception e){
    e.printStackTrace();
} 

Ответ 8

Используйте этот код

activity?.let {
it.supportFragmentManager.fragments.forEach { fragment ->
        it.supportFragmentManager.beginTransaction().remove(fragment).commit()
    }
}

Надеюсь, поможет.

Спасибо.