2015-10-20 7 views
9

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

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

Спасибо,

+0

Возможные дубликатом [Фрагменты: Удалить все фрагменты в представлении] (http://stackoverflow.com/questions/14764043/fragments-remove -all-fragments-in-a-view) – ThomasThiebaud

ответ

28

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

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

* осколочная является объектом фрагмента, который вы хотите удалить.

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

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

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

+0

Как я могу быть уверенным, что контейнер контейнера объектов представляет собой R.id.mycontainer? –

+0

Это только для вас ссылка, которую вы можете заменить своими идентификаторами. –

+0

спасибо @ user1632209 –

3

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

Инициализация:

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(); 
    } 
} 

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

+0

он тоже работает, спасибо :) –

7

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

for(Fragment fragment:getSupportFragmentManager().getFragments()){ 

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

Но в случае навигации полки быть уверен, чтобы проверить его, если вы попытаетесь удалить его, вы получите сообщение об ошибке.

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(); 
     } 
    } 
+0

Спасибо. Что такое 'NavigationDrawerFragment'? Это будет полезно, но я думаю, что это из какой-то библиотеки. – CoolMind

+0

NavigationDrawerFragment - это просто фрагмент, добавленный как навигационный ящик. Это не из какой-либо другой библиотеки. –

+0

Я столкнулся с ситуацией, когда FragmentTransaction 'add' создает нормальный фрагмент, а' replace' создает большую панель инструментов над ним (на Lollipop, с навигационным ящиком). Возможно, вы правы, было бы неплохо создать фиктивный фрагмент и «добавить» других. Вы сделали это? – CoolMind

2

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

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

Попробуйте это, надеюсь, это поможет: 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(); 
} 
+0

Эта проверка не нужна: "if (manager.getBackStackEntryCount()> 0) {" , так как он никогда не будет проходить проход для если это ложь. – Erik

Смежные вопросы