Есть ли способ удалить все фрагменты, которые уже добавили конкретное представление с его идентификатором представления?
Например, я хочу удалить все фрагменты, в которые добавлено представление R.id.fragmentcontainer.
Есть ли способ удалить все фрагменты, которые уже добавили конкретное представление с его идентификатором представления?
Например, я хочу удалить все фрагменты, в которые добавлено представление R.id.fragmentcontainer.
Это очень просто, просто перебрать все фрагменты и удалить его
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();
}
}
Вы можете попробовать под кодом
getSupportFragmentManager().beginTransaction().remove(frag).commit();
* frag - это фрагмент, который вы хотите удалить.
OR
getFragmentManager().beginTransaction().remove(getFragmentManager().findFragmentById(R.id.your_container)).commit();
он удалит фрагмент, который закодирован в контейнере your_container.
HapPy кодирование.
Это действительно очень просто.
private static void removeAllFragments(FragmentManager fragmentManager) {
while (fragmentManager.getBackStackEntryCount() > 0) {
fragmentManager.popBackStackImmediate();
}
}
Сохраните все ваши фрагменты в 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();
}
}
Я использовал этот метод в производстве в течение многих лет, и он работает как шарм. Дайте мне знать, если у вас есть вопросы.
Если кто-то ищет код в Котлине:
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)
}
Более оптимизированная версия
Нет необходимости в многократном вызове commit, поэтому давайте вызовем его один раз в конце
supportFragmentManager.fragments.let {
if (it.isNotEmpty()) {
supportFragmentManager.beginTransaction().apply {
for (fragment in it) {
remove(fragment)
}
commit()
}
}
}
Попробуйте это, надеюсь, что это поможет: 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();
}
Используйте этот код
activity?.let {
it.supportFragmentManager.fragments.forEach { fragment ->
it.supportFragmentManager.beginTransaction().remove(fragment).commit()
}
}
Надеюсь, поможет.
Спасибо.