У меня проблема с поведением задней части. Это то, что я делаю:Предварительная загрузка фрагмента, когда popBackStack
add(fragment1) + addToBackStack(null)
replace(fragment2) + addToBackStack(null)
Что происходит: добавлено
- Фрагмент 1 и в backstack
- Затем второй фрагмент заменяет первый и добавляется к backstack ,
Теперь я хочу изменить свой последний backstacked фрагмент с новой сделкой, поставить новый фрагмент backstack так:
[frag1, frag2] becomes [frag1, frag3]
, но эта сделка, заключенная на popBackStack + replace
делает в frag1
для загрузки путем вызова его onCreateView
и onActivityCreated
. Я знаю, что это ожидаемое поведение, потому что так работает backstack, но я пытаюсь найти способ избежать этой предварительной загрузки.
Редактировать
В этом вопросе я использую понятие фрагмента backstack для транзакции, чтобы быть более ясным. Каждая транзакция здесь представляет собой add + remove (которая является заменой). Код для замены я использую:
public int replaceFragment(BaseFragment newFragment, boolean addToBackStack, boolean animated, PopStackMode popMode) {
if (popMode != null) {
getSupportFragmentManager().popBackStack(newFragment.getFragmentTag(), popMode == PopStackMode.POP_INCLUSIVE ? FragmentManager
.POP_BACK_STACK_INCLUSIVE : 0);
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
if (animated) {
ft.setCustomAnimations(R.anim.slide_in_left, 0, R.anim.slide_out_right, 0);
}
ft.replace(R.id.fragment_container, newFragment, newFragment.getFragmentTag());
if (addToBackStack) {
ft.addToBackStack(newFragment.getFragmentTag());
}
return ft.commit();
}
Вы можете видеть, что я творю навигационную историю на основе фрагмента backstack, как это было своего рода браузер. Когда добавлена «страница», есть фрагмент и транзакция backstack. В этом контексте я пытаюсь:
- Удалить текущий фрагмент.
- Удалите транзакцию из задней части.
- Добавить новый фрагмент без загрузки и загрузки предыдущего фрагмента backstack.
Я надеюсь, что это более понятно.
Edit 2
Я заполнил функцию запроса для флага, который поддерживает такое поведение. Найдите его here.
Вы можете использовать вложенные фрагменты, чтобы назначить фрагмент контейнера на каждом уровне предыдущего стека, который вы, возможно, захотите изменить, и просто изменить дочерний фрагмент. – corsair992
Если это не звучит хорошо, что произойдет, если y заменит представление родителя в контейнере, и я добавлю транзакцию в заднюю часть? Он воссоздает представление, как сейчас. Мне нужен новый контейнер поверх того, который я использую для навигации, чтобы добавить это поведение. Не так ли? – droidpl
Я не совсем понял ваш вопрос, но вложенную замену ребенка не следует добавлять в задний стек. Сам контейнер будет слоем на задней панели, и ребенок будет динамически заменяться (без вмешательства в задний стек). – corsair992