2013-08-17 2 views
6

В настоящее время у меня есть одно действие, и к нему добавляются фрагменты (поиск, информация о песнях, настройки и т. Д.). Я реализовал навигацию на основе боковых панелей, поэтому теперь, как побочный эффект, tehre не ограничивается тем, сколько фрагментов добавлено в Backstack. Есть ли способ ограничить количество фрагментов или удалить старые записи? Каждый фрагмент фрагментов песни имеет рекомендованный список песен, и через него вы можете перейти к фрагменту фрагментов других песен. Легко можно иметь 30 фрагментов в backstack, которые, если у вас открыт DDMS, вы можете медленно видеть (но верно) размер кучи.Android - ограничение количества фрагментов в backStack?

Редактировать: Одна вещь, которую я пытался сделать, - это если пользователь нажал одну из опций бокового меню, если этот фрагмент уже находится в стоп-кадре, попробуйте вернуться к этому фрагменту, а не создавать экземпляр нового, но, конечно, , если пользователь находится на странице «Сведения о песне», тогда он ожидал, что отжатие назад приведет его к этому фрагменту, чтобы он не работал.

Edit 2: Это мой метод addFragment (наряду с предложением Фила):

public void addFragment(Fragment fragment) { 

     FragmentManager fm = getSupportFragmentManager(); 
     if(fm.getBackStackEntryCount() > 2) { 

       fm.popBackStack(); 
      } 
     fm.beginTransaction()     
        .replace(R.id.fragment_container, fragment).addToBackStack("") 
        .commit(); 
} 

Я просто попытался его, и предполагая свою историю фрагмент: A-> B-> C-> D, возвращаясь из D, выходит B-> A-> выход.

Я только что прошел 8 уровней, чтобы проверить: A-> B-> C-> D-> E-> F-> G-> H, и, возвращаясь из H, произошло то же самое: H-> B -> А-> выход.

Все фрагменты добавляются посредством этого метода выше. Я бы хотел увидеть: H-> G-> F-> exit.

ответ

10

Вы можете программно контролировать количество фрагментов в вашем BackStack:

FragmentManager fm = getActivity().getSupportFragmentManager(); 

if(fm.getBackStackEntryCount() > 10) { 

    fm.popBackStack(); // remove one (you can also remove more) 
} 

Просто проверить, сколько фрагментов есть в вашем Backstack и удалить, если есть «переполнение».

Если вы хотите, чтобы удалить определенные фрагменты из BackStack, вы должны реализовать свой собственный BackStack и переопределить onBackPressed(). Поскольку Fragment BackStack представляет собой стек (как указано в названии), можно удалить только верхний элемент (последний добавленный), нет возможности удалить фрагменты между ними.

Можно, например, использовать

ArrayList<Fragment> 

реализовать свой собственный стек. Просто добавьте и удалите фрагменты из этого «стека» (это уже не стек), когда вы желаете и обрабатываете загрузку предыдущих фрагментов, переопределяя метод onBackPressed().

+0

Откуда мой Фраг? Предполагая, что я запускаю этот код, когда собираюсь добавить новый фрагмент, мне уже нужно иметь ссылку на все предыдущие фрагменты? – StackOverflowed

+0

Ну, это всего лишь пример кода, myFrag может, например, быть активным в настоящий момент фрагментом. Этот код также будет работать с вызовом fm.popBackStack() внутри оператора if. –

+0

Кажется, что вы на правильном пути, но я бы хотел, чтобы фрагменты OLDEST были удалены. См. Раздел «Редактирование» для пояснения. Я очень ценю вашу помощь до сих пор. – StackOverflowed

3

Это старый вопрос, но мой ответ может помочь кому-то.

Почему бы не проверить, находится ли фрагмент в стеке и поместить его? Таким образом, вам не придется беспокоиться о размере заднего стека (если у вас много фрагментов).

String backStateName = fragment.getClass().getName(); 
    boolean fragmentPopped = false; 
    try { 
     // true if fragment is in the stack 
     fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    FragmentTransaction ft = fragmentManager.beginTransaction(); 

    if (!fragmentPopped) { //fragment not in back stack, add it...    
     ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     ft.replace(R.id.main, fragment); 
     ft.addToBackStack(backStateName); 

     try { 
      ft.commit(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     }   
    } 
Смежные вопросы