У меня есть активность, которая обрабатывает мои фрагменты. Я создал следующий метод добавления/замены фрагментов и добавить их (или нет) к backstack:Странное поведение в фрагменте Backstack
public void startFragment(CCFragment fragment, boolean addToBackStack) {
final String fragmentTag = fragment.getClass().getSimpleName();
final FragmentManager fragmentManager = getSupportFragmentManager();
// If my fragment is already in the backstack, I don't want to add
// it again, but go back to it:
boolean fragmentPopped=false;
if(fragmentManager.findFragmentByTag(fragmentTag)!=null){
fragmentPopped=true;
fragmentManager.popBackStack(fragmentTag,0);
}
//If it is not, I want to add/replace it
if (!fragmentPopped) {
fragment.setFragmentDelegate(this);
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragmentTransaction.replace(CONTENT_VIEW_ID, fragment, fragmentTag);
if (addToBackStack)
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
Это прекрасно работает, пока следующий сценарий не происходит:
startFragment (F1, ложный); // ничего в стопке
startFragment (F2, true); // F1 в задней стопке
startFragment (F3, false); // F1 в задней стопке
startFragment (F1, false); -> когда я это называю, он вводит «если», и popBackStack не будет работать, поэтому мое приложение остается на F3 вместо возврата в F1. Если я нажму кнопку «Назад», приложение переходит в F1 ...
Так что же я делаю неправильно здесь? Я уже проверял правильность сохранения имен.
спасибо за ваш ответ, но это не проблема. Метод findFragmentByTag ищет имя, указанное в методе fragmentTransaction.replace (CONTENT_VIEW_ID, фрагмент, фрагмент). Я пробовал все, что вы говорите, и он не будет работать. –
Вы получаете фрагмент в backstack своим именем backstackentry, который устанавливается, когда вы добавляете toBackStack (тег). Вы можете использовать приведенный выше код, который я добавил, чтобы проверить текущие имена записей в вашей задней части. – NameSpace
Вы правы! –