0

У меня есть активность, которая обрабатывает мои фрагменты. Я создал следующий метод добавления/замены фрагментов и добавить их (или нет) к 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 ...

Так что же я делаю неправильно здесь? Я уже проверял правильность сохранения имен.

ответ

1
ft.addToBackStack(tag); 

Я не уверен в этом, но при добавлении фрага к заднему стеку, я считаю, вы должны пометить его (снова). В вашем коде вы не поставляете тег, но используете нуль, поэтому нет тега для поиска, и даже если бы он использовал оригинальный тег, вы перезаписываете его нулевым.

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

FragmentManager mgr = getFragmentManager();     
BackStackEntry be = mgr.getBackStackEntryAt(mgr.getBackStackEntryCount()-1); 
String tag be.getName(); 

System.out.println("tag " + tag); 
+0

спасибо за ваш ответ, но это не проблема. Метод findFragmentByTag ищет имя, указанное в методе fragmentTransaction.replace (CONTENT_VIEW_ID, фрагмент, фрагмент). Я пробовал все, что вы говорите, и он не будет работать. –

+0

Вы получаете фрагмент в backstack своим именем backstackentry, который устанавливается, когда вы добавляете toBackStack (тег). Вы можете использовать приведенный выше код, который я добавил, чтобы проверить текущие имена записей в вашей задней части. – NameSpace

+0

Вы правы! –